Jump to content

OpenGL Programming/Intermediate/Materials

From Wikibooks, open books for an open world

In OpenGL, materials can be defined using lighting parameters that affect the way a surface appears when lit. The lighting parameters include the ambient, diffuse, specular and emission components, which define how the material responds to different types of light.

Here's an example of how to set up a simple material in OpenGL using C++:

GLfloat mat_ambient[] = { 0.0f, 0.0f, 0.0f, 1.0f };
GLfloat mat_diffuse[] = { 0.8f, 0.8f, 0.8f, 1.0f };
GLfloat mat_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
GLfloat mat_emission[] = { 0.0f, 0.0f, 0.0f, 1.0f };
GLfloat mat_shininess = 50.0f;

glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);
glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
glMaterialfv(GL_FRONT, GL_EMISSION, mat_emission);
glMaterialf(GL_FRONT, GL_SHININESS, mat_shininess);

In OpenGL, materials can be defined using lighting parameters that affect the way a surface appears when lit. The lighting parameters include the ambient, diffuse, specular and emission components, which define how the material responds to different types of light.

Here's an example of how to set up a simple material in OpenGL using C++:

In this example, mat_ambient, mat_diffuse, mat_specular, mat_emission, and mat_shininess are all material properties that can be set for a surface.

The glMaterialfv function is used to set each of the material components, which are specified as an array of four floats. The first three components specify the RGB values of the material, and the fourth component specifies the alpha value.

Finally, the glMaterialf function is used to set the shininess of the material, which affects the size and brightness of the specular highlight.

Once the material properties have been set, you can render your geometry using lighting. You'll need to set up lighting sources and enable lighting in your OpenGL context, as well as set the position and direction of your light sources.


Here's an example of how to set up lighting and render your geometry with the material properties you've defined:

// Set up lighting
GLfloat light_ambient[] = { 0.2f, 0.2f, 0.2f, 1.0f };
GLfloat light_diffuse[] = { 0.8f, 0.8f, 0.8f, 1.0f };
GLfloat light_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
GLfloat light_position[] = { 0.0f, 1.0f, 0.0f, 1.0f };

glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);
glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
glLightfv(GL_LIGHT0, GL_POSITION, light_position);

glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);

// Render your geometry
glBegin(GL_TRIANGLES);
// Define your geometry vertices
glNormal3f(0.0f, 0.0f, 1.0f); // Set the normal for the face
glVertex3f(0.0f, 0.0f, 0.0f); // Vertex 1
glVertex3f(1.0f, 0.0f, 0.0f); // Vertex 
glVertex3f(1.0f, 1.0f, 0.0f); // Vertex 2
glVertex3f(0.0f, 1.0f, 0.0f); // Vertex 3
glEnd();

In this example, `GL_LIGHT0` is used to define the first light source, and its ambient, diffuse, and specular components are set using `glLightfv`. The `glEnable` function is used to enable lighting and enable the light source.

To render your geometry with the material properties you've defined, you'll need to specify the normal for each face of your geometry using the `glNormal3f` function, and then define each vertex of your geometry using `glVertex3f`. When you render your geometry, OpenGL will use the lighting parameters you've defined to shade your geometry based on the position and direction of your light sources.

This is just a basic example of how to use materials in OpenGL using C++. There are many more material parameters you can set, as well as more advanced lighting techniques you can use to create realistic lighting effects.