Sampling and Aliasing Kurt Akeley CS248 Lecture 3 2 October 2007
Clever Uses of OpenGL Kurt Akeley CS248 Lecture 16 15 November 2007
-
Upload
rudolph-mccormick -
Category
Documents
-
view
217 -
download
4
Transcript of Clever Uses of OpenGL Kurt Akeley CS248 Lecture 16 15 November 2007
Clever Uses of OpenGL
Kurt Akeley
CS248 Lecture 16
15 November 2007
http://graphics.stanford.edu/courses/cs248-07/
CS248 Lecture 16 Kurt Akeley, Fall 2007
Emphasis
Is on OpenGL mechanisms and their application
OpenGL is a power tool
It can be applied in clever and non-obvious ways
Is not full coverage of useful graphics algorithms
Many will not be covered
But what we do cover will be useful
CS248 Lecture 16 Kurt Akeley, Fall 2007
Reference
Advanced Graphics Programming Using OpenGL
Tom McReynolds (NVIDIA)
David Blythe (Microsoft, Direct3D 10 architect)
CS248 Lecture 16 Kurt Akeley, Fall 2007
Informal taxonomy of clever uses
Accumulation Z-buffer Transparent surfaces Multisample antialiased surfaces with pre-filtered lines Image composition
Texture Contour mapping Image warping Billboards Implementing pre-filter antialiasing with texture lookup Volume rendering
Polygon offset Coplanar primitives Hidden-line rendering
Stencil Capping Shadow volumes
GPGPU
CS248 Lecture 16 Kurt Akeley, Fall 2007
Invariance
On a single machine
Appendix A Invariant enable/disable
Consistent input sequence E.g., use glFrontFace to reverse facing direction,
rather than reordering the vertexes or reflecting by scaling
Cross-platform
Be careful! OpenGL’s design emphasized cross-platform
compatibility
But there are still many differences between platforms
Endian issues and support
CS248 Lecture 16 Kurt Akeley, Fall 2007
Accumulation
Basic idea:
Build up a final image in the framebuffer by depth buffering and/or blending multiple images
Examples
Z-buffer
Transparent surfaces
Multisample solids with pre-filtered antialiased lines
Image composition
CS248 Lecture 16 Kurt Akeley, Fall 2007
Z-buffer
glEnable(GL_DEPTH_TEST);glDisable(GL_DEPTH_TEST);
glDepthFunc(GL_NEVER | GL_LESS | GL_EQUAL | GL_LEQUAL | GL_GREATER | GL_NOTEQUAL | GL+GEQUAL | GL_ALWAYS);glDepthFunc(GL_ALWAYS); // invariant disable
glDepthMask(GL_TRUE); // enable writingglDepthMask(GL_FALSE); // disable writing
if (Zfrag depthfunc Zpixel) { if (Rcolormask) Rpixel Rfrag; if (Gcolormask) Gpixel Gfrag; if (Bcolormask) Bpixel Bfrag; if (Acolormask) Apixel Afrag; if (depthmask) Zpixel Zfrag;}
CS248 Lecture 16 Kurt Akeley, Fall 2007
Transparent surfaces
glEnable(GL_DEPTH_TEST);glEnable(GL_LIGHTING);draw opaque objects
glDepthMask(GL_FALSE); // key OpenGL modeglEnable(GL_BLEND);glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);glEnable(GL_CULL_FACE); // optionalglCullFace(GL_BACK);draw transparent surfaces in any order
glDisable(GL_DEPTH_TEST);glDisable(GL_LIGHTING);glDepthMask(GL_TRUE);glDisable(GL_BLEND);glDisable(GL_CULL_FACE);
CS248 Lecture 16 Kurt Akeley, Fall 2007
Multisample and pre-filter antialiasing
glEnable(GL_DEPTH_TEST);glEnable(GL_LIGHTING);glEnable(GL_MULTISAMPLE);draw solid objects (triangles)
glDepthMask(GL_FALSE);glDisable(GL_MULTISAMPLE);glEnable(GL_LINE_SMOOTH);glEnable(GL_BLEND);glBlendFunc(GL_SRC_ALPHA, GL_ONE);glDisable(GL_LIGHTING); // optionaldraw pre-filter antialiased lines in any order
glDisable(GL_DEPTH_TEST);glDisable(GL_LIGHTING);glDepthMask(GL_TRUE);glDisable(GL_LINE_SMOOTH);glDisable(GL_BLEND);
CS248 Lecture 16 Kurt Akeley, Fall 2007
Image composition (fade)
glEnable(GL_BLEND);glBlendFunc(GL_CONSTANT_ALPHA, GL_ONE);
glBlendColor(0, 0, 0, first weight);glDrawPixels(first image);
glBlendColor(0, 0, 0, second weight);glDrawPixels(second image);
glDisable(GL_BLEND);
CS248 Lecture 16 Kurt Akeley, Fall 2007
Image composition (over)
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ZERO);glDrawPixels(first image);
gllendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);glDrawPixels(second image);
glDisable(GL_BLEND);
CS248 Lecture 16 Kurt Akeley, Fall 2007
Texture
Basic idea:
Use texture mapping mechanisms for creative purposes
Examples
Contour mapping
Image warping
Billboards
Implementing pre-filter antialiasing texture lookup
Volume rendering
CS248 Lecture 16 Kurt Akeley, Fall 2007
Contour mapping
glEnable(GL_DEPTH_TEST);glEnable(GL_LIGHTING);glEnable(GL_TEXTURE_1D);glEnable(GL_TEXTURE_GEN_S);glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);glTexGenfv(GL_S, GL_EYE_PLANE, vec4f(f, 0, 10, 0, 0));draw objects without specifying texture coordinates
glDisable(GL_DEPTH_TEST);glDisable(GL_LIGHTING);glDisable(GL_TEXTURE_1D);glDisable(GL_TEXTURE_GEN_S);
Today a vertex shader is amore general TexGen mechanism.
But the notion of generated texturecoordinates remains important.
CS248 Lecture 16 Kurt Akeley, Fall 2007
Image warping
glEnable(GL_TEXTURE_2D);for (y=0; y<(height-1); ++y) { glBegin(GL_QUAD_STRIP); for (x=0; x<width; ++x) { glTexCoord2fv(tex[index(x,y)]); glVertex2fv (vtx[index(x,y)]); glTexCoord2fv(tex[index(x,y+1)]); glVertex2fv (vtx[index(x,y+1)]); } glEnd();}
CS248 Lecture 16 Kurt Akeley, Fall 2007
Billboards
Poster-child application of geometry shaders!
Vertex assembly
Primitive assembly
Rasterization
Fragment operations
Display
Vertex operations
Application
Primitive operations
FramebufferAdvanced Graphics Programming Using OpenGL
Figure 13.4
CS248 Lecture 16 Kurt Akeley, Fall 2007
The magic of machine shops
Sewing machines make clothes
But machine tools make machine tools
And computers are this century’s machine tools
Hagley Machine Shop, Wilmington, DEPhoto by Incaz, Flickr
CS248 Lecture 16 Kurt Akeley, Fall 2007
Pre-filter antialiasing via texture lookup
Another ideal geometry-shader application
// draw pre-filtered point at (x,y)const float h = 1.5; // 3x3 filterglEnable(GL_TEXTURE_2D);glBegin(GL_QUADS);glTexCoord2f(0, 0); glVertex2f(x-h, y-h);glTexCoord2f(0, 1); glVertex2f(x-h, y+h);glTexCoord2f(1, 1); glVertex2f(x+h, y+h);glTexCoord2f(1, 0); glVertex2f(x+h, y-h);glEnd();
Vertex assembly
Primitive assembly
Rasterization
Fragment operations
Display
Vertex operations
Application
Primitive operations
Framebuffer
(0 0) (1 0)
(1 1)(0 1)
(x-h y-h) (x+h y-h)
(x+h y+h)(x-h y+h)
CS248 Lecture 16 Kurt Akeley, Fall 2007
Volume rendering
Advanced Graphics Programming Using OpenGLFigure 20.12
Advanced Graphics Programming Using OpenGLFigure 20.13
CS248 Lecture 16 Kurt Akeley, Fall 2007
Polygon offset
Basic idea:
Avoid depth fighting by biasing Z values
Examples
Coplanar primitives
Hidden lines
Silhouette edges
CS248 Lecture 16 Kurt Akeley, Fall 2007
Polygon mode
glPolygonMode(GLenum face, GLenum mode);
GL_FILL, GL_LINE, GL_POINT
GL_FRONT, GL_BACK, GL_FRONT_AND_BACK
GL_FILL GL_LINE GL_POINT
Face culling happensbefore conversionto lines or points!
CS248 Lecture 16 Kurt Akeley, Fall 2007
Polygon offset
glEnable/glDisable(GL_POLYGON_OFFSET_FILL | GL_POLYGON_OFFSET_LINE | GL_POLYGON_OFFSET_POINT);
glPolygonOffset(GLfloat factor, GLfloat units);
2 2
w ww w
w w
z zz z units r factor
x y
æ ö æ ö¶ ¶÷ ÷ç ç¢ ÷ ÷= + ×+ × +ç ç÷ ÷ç ç÷ ÷ç ç¶ ¶è ø è ø
Triangle(on edge)
Line(on
edge)
View position
-z
Correspond to polygon
modes
Minimum resolvable z-buffer
difference
CS248 Lecture 16 Kurt Akeley, Fall 2007
Coplanar primitives
glEnable(GL_DEPTH_TEST);glEnable(GL_LIGHTING);glEnable(GL_POLYGON_OFFSET_FILL);glPolygonOffset(maxwidth/2, 1);draw planar surface
glDepthMask(GL_FALSE);glDisable(GL_POLYGON_OFFSET_FILL);draw points, lines, and polygons on the planar surface
glDisable(GL_DEPTH_TEST);glDisable(GL_LIGHTING);glDepthMask(GL_TRUE);
CS248 Lecture 16 Kurt Akeley, Fall 2007
Hidden lines
glEnable(GL_DEPTH_TEST);glDisable(GL_LIGHTING);glColorMask(false, false, false, false);glEnable(GL_POLYGON_OFFSET_FILL);glPolygonOffset(maxwidth/2, 1);draw solid objects
glDepthMask(GL_FALSE);glColorMask(true, true, true, true);glColor3f(linecolor);glDisable(GL_POLYGON_OFFSET_FILL);glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);draw solid objects again
glDisable(GL_DEPTH_TEST);glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);glDepthMask(GL_TRUE);
CS248 Lecture 16 Kurt Akeley, Fall 2007
Silhouette lines (true hidden-line drawing)
glEnable(GL_DEPTH_TEST);glDisable(GL_LIGHTING);glColorMask(false, false, false, false);glEnable(GL_POLYGON_OFFSET_FILL);glPolygonOffset(maxwidth/2, 1);draw solid objects
glDepthMask(GL_FALSE);glColorMask(true, true, true, true);glColor3f(1, 1, 1);glDisable(GL_POLYGON_OFFSET_FILL);glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);glEnable(GL_CULL_FACE);glCullFace(GL_FRONT);draw solid objects againdraw true edges // for a complete hidden-line drawing
glDisable(GL_DEPTH_TEST);glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);glDepthMask(GL_TRUE);glDisable(GL_CULL_FACE);
Additions to the hidden-line
algorithm (previous slide) highlighted
in red
CS248 Lecture 16 Kurt Akeley, Fall 2007
Stencil
Basic idea:
Implement a simple state machine in every pixel
Examples
Capping
Shadow volumes
CS248 Lecture 16 Kurt Akeley, Fall 2007
Stencil
glEnable(GL_STENCIL_TEST);glDisable(GL_STENCIL_TEST);
glStencilFunc(GLenum func, GLint ref, GLuint mask);
glStencilOp(GLenum fail, GLenum zfail, GLenum zpass);
glStencilMask(GLuint mask);
GL_NEVER, GL_LESS, GL_LEQUAL, GL_GREATER, GL_GEQUAL, GL_EQUAL,
GL_NOTEQUAL, GL_ALWAYS
GL_KEEP, GL_ZERO, GL_REPLACE (with ref), GL_INCR, GL_DECR,
GL_INVERT
Bitmask, not Boolean flag
CS248 Lecture 16 Kurt Akeley, Fall 2007
Z-buffer operation (again)
if (Zfrag depthfunc Zpixel) { if (Rcolormask) Rpixel Rfrag; if (Gcolormask) Gpixel Gfrag; if (Bcolormask) Bpixel Bfrag; if (Acolormask) Apixel Afrag; if (depthmask) Zpixel Zfrag;}
CS248 Lecture 16 Kurt Akeley, Fall 2007
Stencil operation
if ((ref & mask) stencilfunc (Spixel & mask)) { if (Zfrag depthfunc Zpixel) { if (Rcolormask) Rpixel Rfrag; if (Gcolormask) Gpixel Gfrag; if (Bcolormask) Bpixel Bfrag; if (Acolormask) Apixel Afrag; if (depthmask) Zpixel Zfrag; StencilOp(zpass); } else { StencilOp(zfail); }}else { StencilOp(fail);}
Z-buffer operation
Stencil implements a state machine in each
pixel .(A programmable action occurs in every cases)
CS248 Lecture 16 Kurt Akeley, Fall 2007
Capping
glEnable(GL_DEPTH_TEST); // remains enabledglEnable(GL_LIGHTING);for (int i=0; i<max; ++i) { drawWithCap(model, i);
drawWithCap(int model, int i) { setMaterial(model, i); glEnable(GL_CLIP_PLANE0); glEnable(GL_STENCIL_TEST); glEnable(GL_CULL_FACE); glStencilFunc(GL_GEQUAL, 1, 3); // don’t change capped pixels
glCullFace(GL_BACK); // render frontfacing only glStencilOp(GL_KEEP, GL_KEEP, GL_ZERO); // clear stencil to 0 drawModel(model, i);
glCullFace(GL_FRONT); // render backfacing only glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE); // set stencil to 1 drawModel(model, i);
glDisable(GL_CULL_FACE); glDisable(GL_CLIP_PLANE0); glStencilFunc(GL_EQUAL, 1, 3); // draw only where stencil is 1 glStencilOp(GL_KEEP, GL_KEEP, GL_INCR); // set stencil to 2 drawCap();
glDisable(GL_STENCIL_TEST);}
…
CS248 Lecture 16 Kurt Akeley, Fall 2007
Shadow volumes
Similar to capping:
Render the scene
Render shadow volumes Don’t change color or depth
Use stencil to determine in/out
Reduce intensities of pixels in shadow
Common game technique
E.g., Quake, Doom
Simple frustum culling fails!
Must keep light sources and occluders that cast shadows on geometry within the frustum
CS248 Lecture 16 Kurt Akeley, Fall 2007
GPGPU
Basic idea:
General-purposes computing on GPUs
Take advantage of the huge compute power of modern GPUs
CS248 Lecture 16 Kurt Akeley, Fall 2007
Multi-pass vector processing (2000)
#include “marble.h”surface marble() { varying color a; uniform string fx; uniform float x; x = ½; fx = “noisebw.tx”; FB = texture(tx, scale(x,x,x)); repeat(3) { x = x * 0.5; FB *= 0.5; FB += texture(tx, scale(x,x,x)); } FB = lookup(FB,tab); a = FB; FB = diffuse; FB *= a; FB += environment(“env”);}
Treat OpenGL as a very long instruction word
Compute vector style
Apply inst. to all pixels
Build up final image in many passes
Peercy, Olano, Airey, and Ungar, Interactive Multi-Pass Programmable Shading, SIGGRAPH 2000
(Figure adapted from the SIGGRAPH paper)
CS248 Lecture 16 Kurt Akeley, Fall 2007
GPGPU
Still operates on images
Conceptually 2-D arrays of data elements
Deemphasizes VLIW thinking
Most pipeline stages are not used
What is used: Rasterization (to generate and schedule data elements)
Fragment operations (specifically the programmable shader)
Texture lookup and filter (gather, not a stream processor)
Fragment/framebuffer operations (usually limited to write)
Emphasizes data-parallel programmability
Clever solutions have been developed for
Scatter
Reduction
Sorting …
CS248 Lecture 16 Kurt Akeley, Fall 2007
Modern GPGPU
Graphics APIs (OpenGL, Direct 3D) being replaced:
CUDA (NVIDIA)
CTM (AMD)
Great results being achieved:
Technical: 10x performance improvement in some cases
Business: multi-billion dollars anticipated soon
Coming soon:
IEEE double precision arithmetic
Greater exposure of hardware details (AMD)
Intel Larrabee
…
CS248 Lecture 16 Kurt Akeley, Fall 2007
Summary
Powerful OpenGL mechanisms (some introduced by IRIS/OpenGL):
8-way comparison and masks (depth, stencil, alpha, …)
Texture features: 3-D
TexGen and Texture coordinate matrix
Homogeneous coordinates
Application to all primitives (not just triangles)
glPolygonOffset
Stencil (state machine in a pixel)
Shaders have devalued some of these (e.g., TexGen) but most remain valuable
It’s fun and productive to devise clever uses of OpenGL
CS248 Lecture 16 Kurt Akeley, Fall 2007
Assignments
No class next week
Next lecture: Color theory (Tuesday 27 November)
Reading assignment: FvD 13.2 through 13.6