The topics that we've covered so far, that make up the basics of 3D in OpenGL, are:
Feature | Functions | Example |
---|---|---|
Perspective projection | gluPerspective(fov, aspect, near, far) | glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(30.0, 1.0, 1.0, 100.0); glMatrixMode(GL_MODELVIEW); |
Depth buffering | glEnable(GL_DEPTH_TEST)
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH) |
in main():
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);in draw function: glEnable(GL_DEPTH_TEST); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); |
Transformations | glLoadIdentity()
glTranslatef(x, y, z) glRotatef(angle, x, y, z) glScalef(x, y, z) | glLoadIdentity(); glTranslatef(0.0, 0.0, -20.0); glRotatef(30.0, 1.0, 0.0, 0.0); /* Rotate 30 degrees about X */ glRotatef(-45.0, 0.0, 1.0, 0.0); /* Rotate -45 degrees about Y */ |
Hierarchical transformations | glPushMatrix()
glPopMatrix() | glPushMatrix(); glTranslatef(-3.0, 0.0, 0.0); glutWireTorus(0.2, 1.0, 6, 12); glPopMatrix(); glPushMatrix(); glTranslatef(0.0, 0.0, 2.0); glScalef(0.25, 0.5, 0.5); glutWireTorus(0.2, 1.0, 6, 12); glPopMatrix(); |
Geometry | glBegin(geometryType)
glEnd() glVertex3f(x, y, z) glVertex3fv(v) | glBegin(GL_TRIANGLES); glVertex3f(0.0, 0.0, 0.0); glVertex3f(10.0, 0.0, -1.0); glVertex3f(5.0, 7.0, -1.0); glEnd(); |
Light source | glEnable(lightSource)
glLightfv(lightSource, GL_DIFFUSE, color) glLightfv(lightSource, GL_AMBIENT, color) glLightfv(lightSource, GL_SPECULAR, color) glLightfv(lightSource, GL_POSITION, position) glLightf(lightSource, GL_CONSTANT_ATTENUATION, value) glLightf(lightSource, GL_LINEAR_ATTENUATION, value) glLightf(lightSource, GL_QUADRATIC_ATTENUATION, value) glLightfv(lightSource, GL_SPOT_DIRECTION, direction) glLightf(lightSource, GL_SPOT_CUTOFF, cutoffAngle) glLightf(lightSource, GL_SPOT_EXPONENT, exponent) | GLfloat white[4] = { 1, 1, 1, 1 }; GLfloat lightPos[4] = { -5, 4, 0, 1 }; GLfloat spotDirection[3] = { 0, -1, -1 }; glEnable(GL_LIGHT0); glLightfv(GL_LIGHT0, GL_DIFFUSE, white); glLightfv(GL_LIGHT0, GL_POSITION, lightPos); glLightf(GL_LIGHT0, GL_CONSTANT_ATTENUATION, 1.0); glLightf(GL_LIGHT0, GL_LINEAR_ATTENUATION, 0.1); glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, spotDirection); glLightf(GL_LIGHT0, GL_SPOT_CUTOFF, 30); glLightf(GL_LIGHT0, GL_SPOT_EXPONENT, 10.0); |
Material | glMaterialfv(GL_FRONT, GL_DIFFUSE, color)
glMaterialfv(GL_FRONT, GL_AMBIENT, color) glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, color) glMaterialfv(GL_FRONT, GL_SPECULAR, color) glMaterialfv(GL_FRONT, GL_EMISSION, color) glMaterialf(GL_FRONT, GL_SHININESS, shininess) | GLfloat blue[4] = { .1, .4, 1, 1 }; GLfloat white[4] = { 1, 1, 1, 1 }; glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, blue); glMaterialfv(GL_FRONT, GL_SPECULAR, white); glMaterialf(GL_FRONT, GL_SHININESS, 120.0); |
Surface normal | glNormal3f(x, y, z)
glNormal3fv(vector) | glBegin(GL_TRIANGLES); glNormal3f(-0.707, 0.0, 0.707); glVertex3f(-9.0, 1.0, -7.0); glVertex3f(-3.0, 1.0, -1.0); glVertex3f(-3.0, 7.0, -1.0); glEnd(); |
Fog | glEnable(GL_FOG)
glFogi(GL_FOG_MODE, mode) glFogfv(GL_FOG_COLOR, color) glFogf(GL_FOG_START, distance) glFogf(GL_FOG_END, distance) glFogf(GL_FOG_DENSITY, exponent) | GLfloat sky[] = { 0.5, 0.8, 1.0, 0.0 }; glEnable(GL_FOG); glFogi(GL_FOG_MODE, GL_LINEAR); glFogfv(GL_FOG_COLOR, sky); glFogf(GL_FOG_START, 5.0); glFogf(GL_FOG_END, 40.0); |
Define a texture | glGenTextures(1, &textureID)
glBindTexture(GL_TEXTURE_2D, textureID) glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, mode) glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, mode) glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, mode) glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, mode) glTexImage2D(GL_TEXTURE_2D, 0, internalFormat, width, height, 0, format, GL_UNSIGNED_BYTE, textureImage) gluBuild2DMipmaps(GL_TEXTURE_2D, internalFormat, width, height, format, GL_UNSIGNED_BYTE, textureImage) | glGenTextures(1, &textureID1); glBindTexture(GL_TEXTURE_2D, textureID1); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, xdim, ydim, 0, GL_RGBA, GL_UNSIGNED_BYTE, image); |
Apply a texture | glEnable(GL_TEXTURE_2D)
glBindTexture(GL_TEXTURE_2D, textureID) glTexCoord2f(s, t) | glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, textureID1); glBegin(GL_QUADS); glTexCoord2f(0.0, 0.0); glVertex3f(-2.0, -1.0, 0.0); glTexCoord2f(1.0, 0.0); glVertex3f(-0.1, -1.0, 0.0); glTexCoord2f(1.0, 1.0); glVertex3f(-0.1, 1.0, 0.0); glTexCoord2f(0.0, 1.0); glVertex3f(-2.0, 1.0, 0.0); glEnd(); |
Blending | glEnable(GL_BLEND)
glBlendFunc(sourceFactor, destinationFactor) glColor4f(r, g, b, alpha) glColor4fv(color) (or include alpha in material or texture) | GLfloat translucentRed[4] = { 1, 0, 0, 0.5 }; glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glMaterialfv(GL_FRONT, GL_DIFFUSE, translucentRed); glutSolidCube(2.0); |
Alpha-test transparency | glEnable(GL_ALPHA_TEST)
glAlphaFunc(function, referenceValue) | glEnable(GL_ALPHA_TEST); glAlphaFunc(GL_GREATER, 0.25); |