Introduction To OpenGL Programming
Introduction To OpenGL Programming
OpenGLHierarchy
Severallevelsofabstractionareprovided GL
Lowestlevel:vertex,matrixmanipulation glVertex3f(point.x,point.y,point.z)
GLU
Helperfunctionsforshapes,transformations gluPerspective(fovy,aspect,near,far)
GLUT
Highestlevel:Windowandinterfacemanagement glutSwapBuffers()
OpenGLImplementations
OpenGLISanAPI
#include<GL/gl.h> #include<GL/glu.h> #include<GL/glut.h>
OpenGLAPI
Asaprogrammer,youneedtodothe followingthings:
Specifythelocation/parametersofcamera. Specifythegeometry(andappearance). Specifythelights(optional).
OpenGLGeometricPrimitives
GL_LINES GL_POLYGON GL_POINTS GL_LINE_STRIP GL_LINE_LOOP
SpecifyingGeometricPrimitives
Primitivesarespecifiedusing
glBegin(primType); ... glEnd();
primType determineshowverticesarecombined
GLfloat red, green, blue; GLfloat x, y; glBegin(primType); for (i = 0; i < nVerts; i++) { glColor3f(red, green, blue); glVertex2f(x, y); ... // change coord. values } glEnd();
OpenGLVertex/Color CommandFormats
glVertex3fv( v ) glColor3fv( v )
Number of components
2 - (x,y) 3 - (x,y,z), (r,g,b) 4 - (x,y,z,w), (r,g,b,a)
Data Type
b ub s us i ui f d byte unsigned byte short unsigned short int unsigned int float double
Vector
omit v for scalar form e.g., glVertex2f(x, y) glColor3f(r, g, b) Example
OpenGL:Camera
Twothingstospecify:
Physicallocationofcamerainthescene(MODELVIEW matrixinOpenGL).
Whereisthecamera? Whichdirectionisitpointing? Whatistheorientationofthecamera?
Projectionpropertiesofthecamera(PROJECTIONmatrixin OpenGL):
Depthoffield? Fieldofviewinthexandydirections?
OpenGL:MODELVIEW
glMatrixMode(GL_MODELVIEW);//Specifymatrixmode glLoadIdentity();//Clearmodelviewmatrix //UtilityfunctionprovidedbytheGLUAPI(includedwithOpenGL) gluLookAt(eyex,eyey,eyez,centerx,centery,centerz,upx,upy,upz);
y Camera z eye x World center=(0,0,0) x up=y Pointp inworldis: (MODELVIEW*p) incameracoordsys!!!
OpenGL3Dcoordinates
Righthandedsystem Frompointofviewofcameralooking outintoscene: +X right,X left +Y up,Y down +Z behind camera,Z infront Positiverotationsarecounterclockwise aroundaxisofrotation
Sampleprogram
void main( int argc, char** argv ) { int mode = GLUT_RGB|GLUT_DOUBLE; glutInitDisplayMode( mode ); glutCreateWindow( argv[0] ); init(); glutDisplayFunc( display ); glutReshapeFunc( resize ); glutKeyboardFunc( key ); glutIdleFunc( idle ); glutMainLoop(); }
OpenGLInitialization
Setupwhateverstateyouregoingtouse
void init( void ) { glClearColor( 0.0, 0.0, 0.0, 1.0 ); glClearDepth( 1.0 ); glEnable( GL_LIGHT0 ); glEnable( GL_LIGHTING ); glEnable( GL_DEPTH_TEST ); }
Reshape
voidreshape(int w,int h) { /*ThisroutineiscalledwhentheinitialGLwindowiscreated andwhenthewindowisresized.Itisfollowedinexecution bythe'display'routine.*/ /*initializeviewingvalues*/ glViewport (0,0,(GLint)w 1,(GLint)h 1); glMatrixMode (GL_PROJECTION); glLoadIdentity (); glOrtho (0.0,(GLdouble)w,0.0,(GLdouble)h,1.0,1.0); }
Display
voiddisplay(void) { /*clearallpixels*/ glClear (GL_COLOR_BUFFER_BIT); /*don'twait! *startprocessingbufferedOpenGLroutines */ glFlush (); }
Keyboard
Processuserinput
glutKeyboardFunc( keyboard );
void keyboard( unsigned char key, int x, int y ) { switch( key ) { case q : case Q : exit( EXIT_SUCCESS ); break; case r : case R : rotate = GL_TRUE; glutPostRedisplay(); break; } }
Mouse
{ voidmouse(int button,int state,int x,int y) switch(button) { caseGLUT_LEFT_BUTTON: if(state==GLUT_DOWN) printf ("x=%d,y=%d\n",x,y); break; caseGLUT_RIGHT_BUTTON: if(state==GLUT_DOWN) exit(0); break; default: break; } }
SpecifyingTransformations
Programmerhastwostylesofspecifying transformations
specifymatrices(glLoadMatrix, glMultMatrix) specifyoperation(glRotate, glOrtho)
MatrixOperations
SpecifyCurrentMatrixStack
glMatrixMode( GL_MODELVIEW or GL_PROJECTION )
OtherMatrixorStackOperations
glLoadIdentity() glPushMatrix() glPopMatrix()
Viewport
usuallysameaswindowsize viewportaspectratioshouldbesameasprojectiontransformationor resultingimagemaybedistorted
ProjectionTransformation
Shapeofviewingfrustum Perspectiveprojection
gluPerspective( fovy, aspect, zNear, zFar ) glFrustum( left, right, bottom, top, zNear, zFar )
Orthographicparallelprojection
glOrtho( left, right, bottom, top, zNear, zFar )
Example
ModelingTransformations
Moveobject glTranslate{fd}( x, y, z ) Rotateobjectaroundarbitraryaxis glRotate{fd}( angle, x, y, z )
angleisindegrees
Dilate(stretchorshrink)ormirrorobject glScale{fd}( x, y, z )
Example