330 likes | 464 Views
CS101c GPU Programming. Rendering, OpenGL, and Lighting. Today. Review Rendering and OpenGL Go from vertices/triangles to colors on screen. Spaces. Object space Convenient place to model the object. Spaces. World space Common coordinates for the scene. Spaces. Camera space
E N D
CS101cGPU Programming Rendering, OpenGL, and Lighting
Today • Review Rendering and OpenGL • Go from vertices/triangles to colors on screen CS101 GPU Programming
Spaces • Object space • Convenient place to model the object CS101 GPU Programming
Spaces • World space • Common coordinates for the scene CS101 GPU Programming
Spaces • Camera space • Camera placed at origin • Generally looking down –Z, with Y up, X right C CS101 GPU Programming
Spaces ctd • (Clipped) Normalize Device Coordinates • NDC • Camera still down –Z, Y up, X right • Space scaled to x, y, z in [-1, 1] • ‘3D effect’ CS101 GPU Programming
Transformations Between Spaces • Matrix multiplication for Object, World, Camera • Take V = (x, y, z, 1)T • Simply set up a stack of matrix transformations Oi • Multiply together in reverse order to be applied • Vfinal = O1.O2.O3…On.V • Note: TRS = TSR, TRS != RTS != RST, • For T translation, R rotation, S scaling CS101 GPU Programming
Transformations • All transformations as 4x4 matrices • Translation • Translate x, y, z :T= • Scaling • Scale x,y,z by a, b, c: S = CS101 GPU Programming
Transformations • Rotation • Let be the axis of rotation, and a be the angle of rotation, then we define R with: • S = , and • Then R = • Note that R-1 = RT CS101 GPU Programming
Transformations • Projection transformation (Camera -> NDC) CS101 GPU Programming
Transformations • Projection transformation (Camera -> NDC) • n – near, f – far, l – left, r – right,t – top, b -bottom CS101 GPU Programming
Transformations Between Spaces • Projection • Just add P to start of stack: • Vfinal = P .O1.O2…On.V • Vfinal = (x, y, z, w) • VfinalNDC = (x/w, y/w, z/w, 1), clipped to [-1,1] CS101 GPU Programming
Rasterization • Once vertices in NDC, draw triangles • Place pixels everywhere inside triangle boundary, interpolating data at boundaries • Barycentric coordinates • Initial pixel color interpolated from vertex data • Modify with GPU shader code CS101 GPU Programming
Buffers • Z-Buffer • Store the (linearly interpolated) depth values of each pixel • When drawing new pixel, if there’s already a closer pixel, don’t draw the new pixel. • Correctly renders objects in front of each other • Double Buffering • Render to one buffer while drawing other buffer onscreen, swap buffers to redraw. CS101 GPU Programming
OpenGL • How does OpenGL fit into all of this? • Implements basic pipeline • Works as a massive state machine to modify rendering properties • Set a property, won’t change until gets reset by code • E.g. color, transparency mode, lighting mode CS101 GPU Programming
OpenGL State Machine CS101 GPU Programming
OpenGL Transformation Pipeline • Modelview Matrix combines Object-World-Camera CS101 GPU Programming
OpenGL Transformation Stacks • Stacks of matrices; multiplied together at render time • Two stacks to control – Modelview, Projection Modelview Matrix Stack: (32 4x4 matrices) Projection Matrix Stack: (2 4x4 matrices) CS101 GPU Programming
OpenGL Transformation Stacks • Stacks are part of state associated with vertices • Push and pop transformations • I.e., render an arm; push • Translate to hand; draw palm; push • Translate to and draw finger 1; pop • Translate to and draw finger 2; pop • … • Pop; Translate to other hand… CS101 GPU Programming
OpenGL Transformations • Function calls to build 4x4 matrices, and place them on the transformation stack • glTranslate3f(x, y, z); • glRotate3f(a, x, y, z); • a in degrees; x, y, z don’t have to be normalized • glScale3f(x, y, z); • glFrustum(l, r, b, t, n, f); • Sets up projection transformation CS101 GPU Programming
OpenGL Transformations • An easier way to set up projection using GLU-GL Utility Library • gluPerspective(fovy, aspect, near, far); • Aspect – i.e., gl window w/h ratio Aspect = w/h CS101 GPU Programming
OpenGL Geometry/Rendering • Now we have these transformations, we can use them to render triangles. • Render triangle with: • glBegin(GL_TRIANGLES); • glVertex3f(x1, y1, z1); glVertex3f(x2, y2, z2); glVertex3f(x3, y3, z3); • // more sets of 3 vertices for more triangles. • glEnd(); • Add glNormal3f(xi, yi, zi); before each vertex to attach a normal. CS101 GPU Programming
OpenGL Geometry/Rendering • glShade(GL_SMOOTH/GL_FLAT); • Tells OpenGL whether to use per vertex lighting or per face lighting (flat vs. gaussian) • For fixed pipeline, this won’t matter when we do lighting in GPU shaders • Lighting functions to set up light state • Same for material properties • Generally done at initialization • Light/Material state can be read in GPU code, so this step is still useful. CS101 GPU Programming
OpenGL Things to do to render • Initialize • Set up lights, materials, buffering, window size, camera, projection, etc. • Redraw • Clear current buffer (from double buffer setup) • Setup transformations, Begin/End vertices, normals • Swap buffers CS101 GPU Programming
OpenGL Utility Toolkit (GLUT) • Very simple windowing system nicely interfaced with OpenGL • Sets up ‘Callback’ functions that get called when OpenGL needs to update state (redraw, user interface, etc). • We’ll use this for assignments… • … But we’ll give you most of the code CS101 GPU Programming
Simple Lighting Models • Flat, Gaussian, Phong • Per face, per vertex, and per pixel versions of the same lighting equation CS101 GPU Programming
Simple Lighting Models • Sum of several components CS101 GPU Programming
Simple Lighting Models • Diffuse component equation • Id = Cd * cos( a ) • Cd the diffuse color, L light vector, N normal vector N L a CS101 GPU Programming
Simple Lighting Models • Specular component equation • Is = Cs * (R . Eye)S • Cs the specular color, S the ‘shininess’ • R = 2N (L . N) – L • Note: All vectors must be normalized! R N L a a Eye b CS101 GPU Programming
Simple Lighting Models • Specular component graph Specular Power, S R dot Eye CS101 GPU Programming
Simple Lighting Models • Lighting equation • Color = Ia + Id + Is • Ia ambient intensity • Id diffuse intensity • Is specular intensity R N L a a Eye b CS101 GPU Programming
Homework 1 • Implement per pixel lighting using GLSL • Should be very short; mainly want to make sure GLSL is up and running for everyone • Due by class next Wednesday • Submit code for this assignment by either emailing a zip to Tamas, or emailing him the location of the code (CS cluster, UGCS, …) • Include a README explaining issues, and how to run the code! CS101 GPU Programming
Upcoming… • Friday • Recitation for HW1 • Finally start GLSL/GPU programming basics • Monday • More GLSL • Start talking about texturing • Introduce Bump mapping and Normal mapping CS101 GPU Programming