利用opengl实现包含基本图元控制、动作及其控制、纹理、光照、半透明
时间: 2023-08-08 09:06:16 浏览: 44
好的,以下是一个简单的OpenGL程序,可以实现基本图元控制、动作及其控制、纹理、光照、半透明效果:
```
#include <GL/glut.h>
#include <iostream>
GLfloat angle = 0.0f;
GLfloat x = 0.0f;
GLfloat y = 0.0f;
GLfloat z = 0.0f;
GLfloat light_position[] = { 0.0f, 0.0f, 10.0f, 1.0f };
GLfloat light_ambient[] = { 0.0f, 0.0f, 0.0f, 1.0f };
GLfloat light_diffuse[] = { 1.0f, 1.0f, 1.0f, 1.0f };
GLfloat light_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
GLfloat mat_ambient[] = { 0.7f, 0.7f, 0.7f, 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_shininess[] = { 100.0f };
GLubyte img[] = { 255, 255, 255, 255, 0, 0, 0, 255, 0, 255, 0, 255, 0, 0, 255, 255 };
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);
glPushMatrix();
glTranslatef(x, y, z);
glRotatef(angle, 0.0f, 0.0f, 1.0f);
glEnable(GL_TEXTURE_2D);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, img);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
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);
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);
glBegin(GL_TRIANGLES);
glColor4f(1.0f, 0.0f, 0.0f, 0.5f);
glVertex3f(-1.0f, -1.0f, 0.0f);
glColor4f(0.0f, 1.0f, 0.0f, 0.5f);
glVertex3f(1.0f, -1.0f, 0.0f);
glColor4f(0.0f, 0.0f, 1.0f, 0.5f);
glVertex3f(0.0f, 1.0f, 0.0f);
glEnd();
glPopMatrix();
glutSwapBuffers();
}
void reshape(int w, int h) {
glViewport(0, 0, (GLsizei)w, (GLsizei)h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(60.0, (GLfloat)w / (GLfloat)h, 1.0, 20.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(0.0, 0.0, -5.0);
}
void keyboard(unsigned char key, int x, int y) {
switch (key) {
case 'q':
exit(0);
break;
case 'a':
angle += 5.0f;
if (angle > 360.0f) {
angle -= 360.0f;
}
break;
case 'd':
angle -= 5.0f;
if (angle < 0.0f) {
angle += 360.0f;
}
break;
case 'w':
z += 0.5f;
break;
case 's':
z -= 0.5f;
break;
}
glutPostRedisplay();
}
int main(int argc, char** argv) {
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowSize(500, 500);
glutCreateWindow("OpenGL Demo");
init();
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutKeyboardFunc(keyboard);
glutMainLoop();
return 0;
}
```
这个程序中,我们使用了OpenGL的基本图元控制函数glBegin()和glEnd()来绘制一个三角形。我们还使用了glTranslatef()和glRotatef()函数控制三角形的位置和旋转。另外,我们还引入了纹理和光照等OpenGL的高级功能。
希望这个例子能够帮助你更好地理解OpenGL的使用。如果你有任何问题,请随时问我。