1 / 30

OpenGL Shading Methods: Per-Vertex vs Per-Fragment, Polygonal Shading, Flat, Smooth, Gouraud

This article introduces the methods of shading in OpenGL, including per-vertex and per-fragment shading, polygonal shading techniques (flat, smooth, Gouraud), and the need for normals, material properties, and lights. It also covers state-based shading functions and the normalization process. The article provides examples and explanations for specifying point light sources, spotlights, global ambient light, moving light sources, and material properties. It also discusses front and back faces, the emissive term, transparency, and polygonal shading techniques using vertex and normal interpolation.

prall
Download Presentation

OpenGL Shading Methods: Per-Vertex vs Per-Fragment, Polygonal Shading, Flat, Smooth, Gouraud

An Image/Link below is provided (as is) to download presentation 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. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. CS 480/680 Computer Graphics Shading in OpenGL Dr. Frederick C Harris, Jr.

  2. Objectives • Introduce the OpenGL shading methods • per vertex vs per fragment shading • Where to carry out • Discuss polygonal shading • Flat • Smooth • Gouraud

  3. OpenGL shading • Need • Normals • material properties • Lights • State-based shading functions have been deprecated (glNormal, glMaterial, glLight) • Get computer in application or send attributes to shaders

  4. Normalization • Cosine terms in lighting calculations can be computed using dot product • Unit length vectors simplify calculation • Usually we want to set the magnitudes to have unit length but • Length can be affected by transformations • Note that scaling does not preserved length • GLSL has a normalization function

  5. Normal for Triangle p1 n p2 plane n·(p - p0 ) = 0 n = (p2 - p0 ) ×(p1 - p0 ) p p0 normalize n  n/ |n| Note that right-hand rule determines outward face

  6. Specifying a Point Light Source • For each light source, we can set an RGBA for the diffuse, specular, and ambient components, and for the position vec4 diffuse0 =vec4(1.0, 0.0, 0.0, 1.0); vec4 ambient0 = vec4(1.0, 0.0, 0.0, 1.0); vec4 specular0 = vec4(1.0, 0.0, 0.0, 1.0); vec4 light0_pos =vec4(1.0, 2.0, 3,0, 1.0);

  7. Distance and Direction • The source colors are specified in RGBA • The position is given in homogeneous coordinates • If w =1.0, we are specifying a finite location • If w =0.0, we are specifying a parallel source with the given direction vector • The coefficients in distance terms are usually quadratic (1/(a+b*d+c*d*d)) where d is the distance from the point being rendered to the light source

  8. Spotlights • Derive from point source • Direction • Cutoff • AttenuationProportional to cosaf f q -q

  9. Global Ambient Light • Ambient light depends on color of light sources • A red light in a white room will cause a red ambient term that disappears when the light is turned off • A global ambient term that is often helpful for testing

  10. Moving Light Sources • Light sources are geometric objects whose positions or directions are affected by the model-view matrix • Depending on where we place the position (direction) setting function, we can • Move the light source(s) with the object(s) • Fix the object(s) and move the light source(s) • Fix the light source(s) and move the object(s) • Move the light source(s) and object(s) independently

  11. Material Properties • Material properties should match the terms in the light model • Reflectivities • w component gives opacity vec4 ambient = vec4(0.2, 0.2, 0.2, 1.0); vec4 diffuse = vec4(1.0, 0.8, 0.0, 1.0); vec4 specular = vec4(1.0, 1.0, 1.0, 1.0); GLfloat shine = 100.0

  12. Front and Back Faces • Every face has a front and back • For many objects, we never see the back face so we don’t care how or if it’s rendered • If it matters, we can handle in shader back faces not visible back faces visible

  13. Emissive Term • We can simulate a light source in OpenGL by giving a material an emissive component • This component is unaffected by any sources or transformations

  14. Transparency • Material properties are specified as RGBA values • The A value can be used to make the surface translucent • The default is that all surfaces are opaque regardless of A • Later we will enable blending and use this feature

  15. Polygonal Shading • In per vertex shading, shading calculations are done for each vertex • Vertex colors become vertex shades and can be sent to the vertex shader as a vertex attribute • Alternately, we can send the parameters to the vertex shader and have it compute the shade • By default, vertex shades are interpolated across an object if passed to the fragment shader as a varying variable (smooth shading) • We can also use uniform variables to shade with a single shade (flat shading)

  16. Polygon Normals • Triangles have a single normal • Shades at the vertices as computed by the Phong model can be almost same • Identical for a distant viewer (default) or if there is no specular component • Consider model of sphere • Want different normals at each vertex even though this concept is not quite correct mathematically

  17. Smooth Shading • We can set a new normal at each vertex • Easy for sphere model • If centered at origin n = p • Now smooth shading works • Note silhouette edge

  18. Mesh Shading • The previous example is not general because we knew the normal at each vertex analytically • For polygonal models, Gouraud proposed we use the average of the normals around a mesh vertex n = (n1+n2+n3+n4)/ |n1+n2+n3+n4|

  19. Gouraud and Phong Shading • Gouraud Shading • Find average normal at each vertex (vertex normals) • Apply modified Phong model at each vertex • Interpolate vertex shades across each polygon • Phong shading • Find vertex normals • Interpolate vertex normals across edges • Interpolate edge normals across polygon • Apply modified Phong model at each fragment

  20. Comparison • If the polygon mesh approximates surfaces with a high curvatures, Phong shading may look smooth while Gouraud shading may show edges • Phong shading requires much more work than Gouraud shading • Until recently not available in real time systems • Now can be done using fragment shaders • Both need data structures to represent meshes so we can obtain vertex normals

  21. Vertex Lighting Shaders I // vertex shader in vec4 vPosition; in vec3 vNormal; out vec4 color; //vertex shade // light and material properties uniform vec4 AmbientProduct, DiffuseProduct, SpecularProduct; uniform mat4 ModelView; uniform mat4 Projection; uniform vec4 LightPosition; uniform float Shininess;

  22. Vertex Lighting Shaders II void main() { // Transform vertex position into eye coordinates vec3 pos = (ModelView * vPosition).xyz; vec3 L = normalize( LightPosition.xyz - pos ); vec3 E = normalize( -pos ); vec3 H = normalize( L + E ); // Transform vertex normal into eye coordinates vec3 N = normalize( ModelView*vec4(vNormal, 0.0) ).xyz;

  23. Vertex Lighting Shaders III // Compute terms in the illumination equation vec4 ambient = AmbientProduct; float Kd = max( dot(L, N), 0.0 ); vec4 diffuse = Kd*DiffuseProduct; float Ks = pow( max(dot(N, H), 0.0), Shininess ); vec4 specular = Ks * SpecularProduct; if( dot(L, N) < 0.0 ) specular = vec4(0.0, 0.0, 0.0, 1.0); gl_Position = Projection * ModelView * vPosition; color = ambient + diffuse + specular; color.a = 1.0; }

  24. Vertex Lighting Shaders IV // fragment shader in vec4 color; void main() { gl_FragColor = color; }

  25. Fragment Lighting Shaders I // vertex shader in vec4 vPosition; in vec3 vNormal; // output values that will be interpolatated per-fragment out vec3 fN; out vec3 fE; out vec3 fL; uniform mat4 ModelView; uniform vec4 LightPosition; uniform mat4 Projection;

  26. Fragment Lighting Shaders II void main() { fN = vNormal; fE = vPosition.xyz; fL = LightPosition.xyz; if( LightPosition.w != 0.0 ) { fL = LightPosition.xyz - vPosition.xyz; } gl_Position = Projection*ModelView*vPosition; }

  27. Fragment Lighting Shaders III // fragment shader // per-fragment interpolated values from the vertex shader in vec3 fN; in vec3 fL; in vec3 fE; uniform vec4 AmbientProduct, DiffuseProduct, SpecularProduct; uniform mat4 ModelView; uniform vec4 LightPosition; uniform float Shininess;

  28. Fragment Lighting Shaders IV void main() { // Normalize the input lighting vectors vec3 N = normalize(fN); vec3 E = normalize(fE); vec3 L = normalize(fL); vec3 H = normalize( L + E ); vec4 ambient = AmbientProduct;

  29. Fragment Lighting Shaders V float Kd = max(dot(L, N), 0.0); vec4 diffuse = Kd*DiffuseProduct; float Ks = pow(max(dot(N, H), 0.0), Shininess); vec4 specular = Ks*SpecularProduct; // discard the specular highlight if the light's behind the vertex if( dot(L, N) < 0.0 ) specular = vec4(0.0, 0.0, 0.0, 1.0); gl_FragColor = ambient + diffuse + specular; gl_FragColor.a = 1.0; }

More Related