glLightfv(GL_LIGHT0, GL_POSITION, sun_direction);
时间: 2024-05-28 07:14:30 浏览: 105
这行代码是用来设置OpenGL场景中的光源的位置和方向的。其中,GL_LIGHT0 表示要设置的光源的编号,这里是设置第一个光源(编号为0)。GL_POSITION 参数表示设置光源的位置和方向,sun_direction 是一个向量,表示光源的方向。这个向量通常是通过计算得到的,比如可以根据太阳的位置来计算得到太阳光的方向向量,然后将其作为参数传递给该函数来设置光源的位置和方向。
相关问题
openGL中设置光照之前需要设置glMatrixMode(GL_MODELVIEW)吗?
需要。在OpenGL中,设置光照需要通过对模型视图矩阵进行操作来实现。而指定接下来要对模型视图矩阵进行操作,需要先调用`glMatrixMode(GL_MODELVIEW)`来设置当前矩阵模式为模型视图矩阵模式。因此,在设置光照之前需要先设置矩阵模式为模型视图矩阵模式。
一般来说,设置光照的步骤是:
1. 开启光照功能:`glEnable(GL_LIGHTING);`
2. 开启指定编号的光源:`glEnable(GL_LIGHT0);`
3. 设置光源的位置、颜色等属性:`glLightfv(GL_LIGHT0, GL_POSITION, position); glLightfv(GL_LIGHT0, GL_AMBIENT, ambient); glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse); glLightfv(GL_LIGHT0, GL_SPECULAR, specular);`
4. 设置材质的反射属性:`glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, ambient); glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, diffuse); glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, specular); glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, shininess);`
需要注意的是,在设置光照之前,需要先设置好视口、投影矩阵和模型视图矩阵等参数,以保证光照的表现效果符合预期。
#include <GL/glut.h> GLfloat light_position[] = { 0.0, 0.0, 10.0, 1.0 };//光照效果 GLfloat light_ambient[] = { 0.2, 0.2, 0.2, 1.0 };//光照效果 GLfloat light_diffuse[] = { 0.8, 0.8, 0.8, 1.0 };//光照效果 GLfloat light_specular[] = { 0.5, 0.5, 0.5, 1.0 };//光照效果 GLfloa
t mat_ambient[] = { 0.7, 0.7, 0.7, 1.0 };//材质反射光颜色 GLfloat mat_diffuse[] = { 0.8, 0.8, 0.8, 1.0 };//材质漫反射光颜色 GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.0 };//材质高光颜色 GLfloat high_shininess[] = { 100.0 };//材质高光度值 GLint cube; //正方体的句柄 void init(void) { glClearColor(0.0, 0.0, 0.0, 0.0); glEnable(GL_DEPTH_TEST); //启用深度测试 glLightfv(GL_LIGHT0, GL_POSITION, light_position); glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient); glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse); glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular); glEnable(GL_LIGHT0); glEnable(GL_LIGHTING); glEnable(GL_COLOR_MATERIAL); glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE); glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular); glMaterialfv(GL_FRONT, GL_SHININESS, high_shininess); glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient); glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse); cube = glGenLists(1); //创建新的显示列表 glNewList(cube, GL_COMPILE); //开始创建显示列表 glBegin(GL_QUADS); //绘制正方体的六个面,每个面有四个顶点 glColor3f(0.0, 1.0, 0.0); //设置正方体的颜色 glNormal3f(0.0, 0.0, 1.0); glVertex3f(-1.0, -1.0, 1.0); glVertex3f(1.0, -1.0, 1.0); glVertex3f(1.0, 1.0, 1.0); glVertex3f(-1.0, 1.0, 1.0); glColor3f(1.0, 0.5, 0.0); glNormal3f(0.0, 0.0, -1.0); glVertex3f(-1.0, -1.0, -1.0); glVertex3f(-1.0, 1.0, -1.0); glVertex3f(1.0, 1.0, -1.0); glVertex3f(1.0, -1.0, -1.0); glColor3f(1.0, 0.0, 0.0); glNormal3f(0.0, 1.0, 0.0); glVertex3f(-1.0, 1.0, -1.0); glVertex3f(-1.0, 1.0, 1.0); glVertex3f(1.0, 1.0, 1.0); glVertex3f(1.0, 1.0, -1.0); glColor3f(1.0, 1.0, 0.0); glNormal3f(0.0, -1.0, 0.0); glVertex3f(-1.0, -1.0, -1.0); glVertex3f(1.0, -1.0, -1.0); glVertex3f(1.0, -1.0, 1.0); glVertex3f(-1.0, -1.0, 1.0); glColor3f(0.0, 0.0, 1.0); glNormal3f(1.0, 0.0, 0.0); glVertex3f(1.0, -1.0, -1.0); glVertex3f(1.0, 1.0, -1.0); glVertex3f(1.0, 1.0, 1.0); glVertex3f(1.0, -1.0, 1.0); glColor3f(1.0, 0.0, 1.0); glNormal3f(-1.0, 0.0, 0.0); glVertex3f(-1.0, -1.0, -1.0); glVertex3f(-1.0, -1.0, 1.0); glVertex3f(-1.0, 1.0, 1.0); glVertex3f(-1.0, 1.0, -1.0); glEnd(); glEndList(); } void display(void) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); glTranslatef(0.0, 0.0, -5.0); glRotatef(30, 1.0, 0.0, 0.0); glRotatef(30, 0.0, 1.0, 0.0); glCallList(cube); //调用显示列表 glutSwapBuffers(); } void reshape(int width, int height) { glViewport(0, 0, (GLsizei)width, (GLsizei)height); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(60, (GLfloat)width / (GLfloat)height, 1.0, 100.0); glMatrixMode(GL_MODELVIEW); } int main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); glutInitWindowSize(400, 400); glutInitWindowPosition(100, 100); glutCreateWindow(argv[0]); init(); glutDisplayFunc(display); glutReshapeFunc(reshape); glutMainLoop(); return 0; }
这段代码是一个简单的 OpenGL 程序,用于绘制一个彩色的立方体,同时加入了光照效果和材质反射光颜色设置。其中,glLightfv 和 glMaterialfv 函数用于设置光照效果和材质反射光颜色。glGenLists 函数用于创建新的显示列表,glNewList 和 glEndList 函数用于开始和结束创建显示列表,glCallList 函数用于调用显示列表。在 display 函数中使用 glLoadIdentity 函数将当前矩阵重置为单位矩阵,glTranslatef 函数进行平移变换,glRotatef 函数进行旋转变换。在 reshape 函数中使用 glViewport 函数设置视口大小,gluPerspective 函数设置投影矩阵。最后,在 main 函数中使用 glutInit 函数初始化 GLUT,glutInitDisplayMode 函数设置显示模式,glutInitWindowSize 函数设置窗口大小,glutCreateWindow 函数创建窗口,glutDisplayFunc 函数设置显示回调函数,glutReshapeFunc 函数设置重塑回调函数,glutMainLoop 函数进入 GLUT 事件处理循环。
阅读全文