- 70 Views
- Uploaded on
- Presentation posted in: General

CS101c GPU Programming

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.

- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -

CS101cGPU Programming

Rendering, OpenGL, and Lighting

- Review Rendering and OpenGL
- Go from vertices/triangles to colors on screen

CS101 GPU Programming

- Object space
- Convenient place to model the object

CS101 GPU Programming

- World space
- Common coordinates for the scene

CS101 GPU Programming

- Camera space
- Camera placed at origin
- Generally looking down –Z, with Y up, X right

C

CS101 GPU Programming

- (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

- 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

- All transformations as 4x4 matrices
- Translation
- Translate x, y, z :T=

- Scaling
- Scale x,y,z by a, b, c: S =

CS101 GPU Programming

- 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

- Projection transformation (Camera -> NDC)

CS101 GPU Programming

- Projection transformation (Camera -> NDC)
- n – near, f – far, l – left, r – right,t – top, b -bottom

CS101 GPU Programming

- 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]

- Just add P to start of stack:

CS101 GPU Programming

- 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

- 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

- 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

CS101 GPU Programming

- Modelview Matrix combines Object-World-Camera

CS101 GPU Programming

- 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

- 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

- 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

- 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

- 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.

- glBegin(GL_TRIANGLES);

CS101 GPU Programming

- 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

- 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

- 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

- Flat, Gaussian, Phong
- Per face, per vertex, and per pixel versions of the same lighting equation

CS101 GPU Programming

- Sum of several components

CS101 GPU Programming

- Diffuse component equation
- Id = Cd * cos( a )
- Cd the diffuse color, L light vector, N normal vector

N

L

a

CS101 GPU Programming

- 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

- Specular component graph

Specular Power, S

R dot Eye

CS101 GPU Programming

- 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

- 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

- 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