OpenGL实现明暗计算。用键盘实现材质的修改(b为黄铜材质,n为红色塑料材质,m为白色光亮材质。用键盘实现光源的修改(o为白色光,p为彩色光)。代码实现
时间: 2024-05-05 18:19:57 浏览: 202
以下是一个OpenGL实现明暗计算并支持材质和光源修改的代码:
```c++
#include <GL/glut.h>
GLfloat light_position[] = { 1.0, 1.0, 1.0, 0.0 };
GLfloat light_diffuse[] = { 1.0, 1.0, 1.0, 1.0 };
GLfloat light_specular[] = { 1.0, 1.0, 1.0, 1.0 };
GLfloat mat_ambient[] = { 0.5, 0.5, 0.5, 1.0 };
GLfloat mat_diffuse[] = { 0.5, 0.5, 0.5, 1.0 };
GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.0 };
GLfloat mat_shininess[] = { 50.0 };
int material = 0, light = 0;
void init(void)
{
glClearColor(0.0, 0.0, 0.0, 0.0);
glShadeModel(GL_SMOOTH);
glEnable(GL_DEPTH_TEST);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
}
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
gluLookAt(0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
glLightfv(GL_LIGHT0, GL_POSITION, light_position);
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_SHININESS, mat_shininess);
glutSolidTeapot(1.0);
glFlush();
}
void keyboard(unsigned char key, int x, int y)
{
switch (key) {
case 'b':
if (material != 0) {
material = 0;
mat_ambient[0] = 0.329412f;
mat_ambient[1] = 0.223529f;
mat_ambient[2] = 0.027451f;
mat_diffuse[0] = 0.780392f;
mat_diffuse[1] = 0.568627f;
mat_diffuse[2] = 0.113725f;
mat_specular[0] = 0.992157f;
mat_specular[1] = 0.941176f;
mat_specular[2] = 0.807843f;
mat_shininess[0] = 27.89743616f;
glutPostRedisplay();
}
break;
case 'n':
if (material != 1) {
material = 1;
mat_ambient[0] = 0.0f;
mat_ambient[1] = 0.0f;
mat_ambient[2] = 0.0f;
mat_diffuse[0] = 0.5f;
mat_diffuse[1] = 0.0f;
mat_diffuse[2] = 0.0f;
mat_specular[0] = 0.7f;
mat_specular[1] = 0.6f;
mat_specular[2] = 0.6f;
mat_shininess[0] = 32.0f;
glutPostRedisplay();
}
break;
case 'm':
if (material != 2) {
material = 2;
mat_ambient[0] = 0.19225f;
mat_ambient[1] = 0.19225f;
mat_ambient[2] = 0.19225f;
mat_diffuse[0] = 0.50754f;
mat_diffuse[1] = 0.50754f;
mat_diffuse[2] = 0.50754f;
mat_specular[0] = 0.508273f;
mat_specular[1] = 0.508273f;
mat_specular[2] = 0.508273f;
mat_shininess[0] = 51.2f;
glutPostRedisplay();
}
break;
case 'o':
if (light != 0) {
light = 0;
light_diffuse[0] = 1.0f;
light_diffuse[1] = 1.0f;
light_diffuse[2] = 1.0f;
light_specular[0] = 1.0f;
light_specular[1] = 1.0f;
light_specular[2] = 1.0f;
glutPostRedisplay();
}
break;
case 'p':
if (light != 1) {
light = 1;
light_diffuse[0] = 1.0f;
light_diffuse[1] = 0.0f;
light_diffuse[2] = 0.0f;
light_specular[0] = 1.0f;
light_specular[1] = 0.0f;
light_specular[2] = 0.0f;
glutPostRedisplay();
}
break;
}
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowSize(500, 500);
glutInitWindowPosition(100, 100);
glutCreateWindow(argv[0]);
init();
glutDisplayFunc(display);
glutKeyboardFunc(keyboard);
glutMainLoop();
return 0;
}
```
在这个程序中,我们定义了两个材质(黄铜和红色塑料)和两个光源(白色光和彩色光)。使用键盘输入可以切换材质和光源。明暗计算是默认开启的,并且使用glMaterial*和glLight*函数进行配置。```glutSolidTeapot```函数用于绘制一个茶壶模型,用于演示材质和光源的效果。