Download { {-1,-1,-1},{1,-1,1}, {1,1,-1},{-1,1,-1}, {-1,-1,1},{1,-1,1

Survey
yes no Was this document useful for you?
   Thank you for your participation!

* Your assessment is very important for improving the work of artificial intelligence, which forms the content of this project

Document related concepts

Stereo photography techniques wikipedia, lookup

Anaglyph 3D wikipedia, lookup

Color wikipedia, lookup

Dither wikipedia, lookup

Autostereogram wikipedia, lookup

Spatial anti-aliasing wikipedia, lookup

Stereo display wikipedia, lookup

Original Chip Set wikipedia, lookup

Graphics processing unit wikipedia, lookup

Indexed color wikipedia, lookup

Molecular graphics wikipedia, lookup

Mesa (computer graphics) wikipedia, lookup

Comparison of OpenGL and Direct3D wikipedia, lookup

BSAVE (bitmap format) wikipedia, lookup

List of 8-bit computer hardware palettes wikipedia, lookup

Color Graphics Adapter wikipedia, lookup

Tektronix 4010 wikipedia, lookup

Apple II graphics wikipedia, lookup

Waveform graphics wikipedia, lookup

OpenGL wikipedia, lookup

Stereoscopy wikipedia, lookup

Perspective projection distortion wikipedia, lookup

Hold-And-Modify wikipedia, lookup

Framebuffer wikipedia, lookup

2.5D wikipedia, lookup

Transcript
Computer Graphics (Spring 2003)
COMS 4160, Lecture 13: OpenGL 2
Ravi Ramamoorthi
http://www.cs.columbia.edu/~cs4160
Many slides courtesy Greg Humphreys
State
• OpenGL is a big state machine
• State encapsulates control for operations like:
– Lighting
– Shading
– Texture Mapping
• Boolean state settings can be turned on and off
with glEnable and glDisable
• Anything that can be set can be queried using
glGet
State Management
• glEnable, glDisable, glIsEnabled
• glGet
• Attributes
– glPointSize, glFrontFace, glCullFace,
• Other advanced topics (later)
– Vertex Arrays
– Display Lists
– Curved surfaces
Immediate vs. Retained Mode
• Two ways of specifying what is to be drawn
– Immediate Mode
• Primitives are sent to the display as soon as they are specified
• Graphics system has no memory of drawn graphics primitives
– Retained Mode
•
•
•
•
Primitives placed in display lists
Display lists can be kept on the graphics server
Can be redisplayed with different graphics state
Almost always a performance win (if you can get away with it)
Event Driven Interaction
• OpenGL does not dictate any particular model of
interaction
• Applications respond to events generated by
devices (i.e., mice) and window system events
(i.e., window resized)
• Events are usually placed in a queue awaiting
action
• Callbacks let you associate a function with a
particular type of event
– Mouse callback
Usual Interactions
• Initialization
– Open / place / resize window
• Expose/resize/hide window
• Mouse
–
–
–
–
Button click
Button release
Mouse motion
Mouse drag (motion + button)
• Keyboard
– What key was pressed (or released)?
– Where was the mouse?
– Were any modifier keys pressed? (control, alt, shift)
GLUT
• OpenGL Utility Toolkit
• Written by Mark Kilgard
• Provides basic window system interaction:
–
–
–
–
Open/close window
Mouse/keyboard callbacks
“Idle” callback for animation
Menus
Typical “main” Function
int main( int argc, char *argv[] )
{
glutInit( &argc, argv );
glutInitDisplayMode( GLUT_SINGLE | GLUT_RGB );
glutCreateWindow( “A window” );
glutDisplayFunc( display );
glutReshapeFunc( reshape );
glutMouseFunc( mouse );
glutIdleFunc( idle );
glutMainLoop();
}
Viewing (Chapter 3)
• Two parts
– Object positioning (GL_MODELVIEW)
– Projection (GL_PROJECTION)
•
•
•
•
Transformation stages (pp 98)
Perspective, Orthographic transformations
Camera always at origin, pointing –z direction
Transforms applied to objects
– Equivalent to moving camera by inverse…
– More details next…
Transformations
• Object in world coordinates (modelview)
– glTranslatef(x,y,z) ; glRotatef(θ,x,y,z) ; glScalef(x,y,z)
– Right-multiply current matrix (last is first applied)
• Matrix Stacks
– glPushMatrix, glPopMatrix, glLoad
– Useful for Hierarchically defined figures
• gluLookAt (fromv,atv,upv)
– Usually in projection matrix, sometimes in modelview
– Concatenate with perspective (orthographic) projection
Sample Code
glMatrixMode( GL_MODELVIEW );
glLoadIdentity();
glTranslatef( 1, 1, 1 );
glRotatef( 90, 1, 0, 0 );
DrawObject();
Positioning the Camera
• Use gluLookAt to specify:
– Eye location
– “Look-at point”
– “up” vector
• gluLookAt( 10, 10, 10, 1, 2, 3, 0, 0, 1 )
– Eye point is (10, 10, 10)
– Look at point is (1,2,3)
– Up vector is (0,0,1)
• This is usually done in the GL_PROJECTION
matrix, and combined with a perspective matrix
Viewing Volumes
• Orthographic projection
– glOrtho( left, right, bottom, top, front, back ) specifies
the boundaries of the parallel viewing volume
– Objects are clipped to the specified viewing cube
• Perspective Projection
– glFrustum, gluPerspective
– Clipping volume is a frustum
• Make sure the near and far clipping planes aren’t
too far apart
• Make sure the near plane isn’t too close to the eye
Complete Viewing Example
//Projection first
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
gluPerspective( 60, 1, 1, 100 );
gluLookAt( 10, 10, 10, 1, 2, 3, 0, 0, 1 )
//Now object transformations
glMatrixMode( GL_MODELVIEW );
glLoadIdentity();
glTranslatef( 1, 1, 1 );
glRotatef( 90, 1, 0, 0 );
DrawObject();
Matrix Stacks
• OpenGL has multiple matrix “stacks”
• glPushMatrix pushes a copy of the top-ofstack matrix
• glPopMatrix throws away the top of the
stack
• Very useful for hierarchichally defined
figures
Color (Chapter 4)
• RGBA
– 8 (or whatever number) bits/color channel
– Alpha A important for transparency
– 32 bits, 16 million colors
• Color Index
– Index into color table, small number of colors (256)
• Shading model glShadeModel
– GL_FLAT, GL_SMOOTH (Goraud)
– Issues in smooth shading with color index?
Simple OpenGL Programs
Drawing Primitives
• Specify primitives using glBegin and glEnd:
glBegin( primitive_type );
…specify vertex attributes
…draw vertices
glEnd();
• primitive_type specifies points, lines, triangles,
quads, polygons, etc…
• GL_POINTS, GL_LINES, GL_TRIANGLES,
GL_QUADS, GL_POLYGON,…
Specifying Vertices
• glVertex{size}{type}{vector}
e.g. glVertex3fv
Coordinates are passed in an array
Coordinate types are float
3 coordinates passed (x,y,z)
glVertex2f( 1.0f, 1.0f );
glVertex3i( 20, 20, 20 );
float verts[4] = { 1.0, 2.0, 3.0, 1.0 };
glVertex4fv( verts );
Example: A Wireframe Cube
GLfloat vertices[][3] = {
{-1,-1,-1},{1,-1,1},
{1,1,-1},{-1,1,-1},
{-1,-1,1},{1,-1,1},
{1,1,1},{-1,1,1}
};
void cube(void)
{
polygon( 1,0,3,2 ); polygon( 3,7,6,2 );
polygon( 7,3,0,4 ); polygon( 2,6,5,1 );
polygon( 4,5,6,7 ); polygon( 5,4,0,1 );
}
Example: A Wireframe Cube
void polygon( int a, int b, int
{
glColor3f( 1,1,1 );
glBegin( GL_LINE_LOOP );
glVertex3fv( vertices[a]
glVertex3fv( vertices[b]
glVertex3fv( vertices[c]
glVertex3fv( vertices[d]
glEnd();
}
c, int d )
);
);
);
);
Specifying Vertex Attributes
• Vertex attributes are state settings that are usually
applied between a glBegin/glEnd pair
• Vertex attributes are set using:
glColor, glNormal, glTexCoord, glEdgeFlag
• Vertex attribute routines take a form similar to
glVertex:
glName{size}{type}{vector}
e.g. glColor3us takes 3 unsigned short parameters
Pixel Primitives
• Provide a way to manipulate rectangles of pixels
• glDrawPixels, glReadPixels, glCopyPixels move
pixel rectangles to and from the framebuffer
• glBitmap takes a binary image and renders the
current color in framebuffer positions
corresponding to 1’s in the image. This might be
useful for drawing fonts
• glRasterPos defines where the pixels go in the
framebuffer
• The interaction between glRasterPos and glBitmap
is subtle and confusing
Hidden Surface Removal
• When we draw a fragment, record the z
(distance to the eye) in the depth buffer
• If the z stored in the depth buffer is greater
than the z for the fragment about to be
drawn, draw it
• Otherwise, the fragment is behind
something that has already been drawn, so
throw it away
Hidden Surface Removal
• When setting up your window, specify a depth
buffer:
glutInitDisplayMode( GLUT_DEPTH );
• When clearing, make sure to:
glClear( GL_DEPTH_BUFFER_BIT );
• glEnable( GL_DEPTH_TEST );
• Set the depth test comparison operation:
glDepthFunc( GL_LESS ); (this is the default)
Simple Shading
Example: shading a sphere with lighting
glShadeModel(GL_FLAT)
glShadeModel(GL_SMOOTH)
OpenGL will interpolate the colors across the face of a polygon
if smooth shading is turned on.