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); |