OpenGL:打开和关闭灯
OpenGL: Turning on and off Lights
本文关键字:OpenGL 更新时间:2023-10-16
我正在编写一个程序,其中我有一个小"polyman"家伙在0,-3
跳舞。我把他涂成白色,现在正试图让迪斯科舞厅般的场景继续下去,我创造了一个蓝色和红色的灯,并试图通过使用计数器和if
和else
语句来交替它们。这一切都在我的renderscene
float ambientlight[] = {0.0,0.0,1.0,1.0};
float diffuselight[] = {1.0,1.0,1.0,1.0};
float specular[] = {1.0,1.0,1.0,1.0};
float lightpos[] = {0.0,10.0,0.0,1.0}; //light 1
float specref[]={1.0,1.0,1.0,1.0};
float spotdir[]={0.0,-10.0,0.0};
float rectX[6][5], rectY[6][5], rectZ[6][5];
float ambientlight2[] = {1.0,0.0,0.0,1.0};
float diffuselight2[] = {1.0,1.0,1.0,1.0};
float specular2[] = {1.0,1.0,1.0,1.0};
float lightpos2[] = {0.0,10.0,0.0,1.0}; //light 2
float specref2[]={1.0,1.0,1.0,1.0};
float spotdir2[]={0.0,-10.0,0.0};
glColor3f(1.0,1.0,1.0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glViewport(0,0,540,440);
glOrtho(-7.0,7.0,-7.0,7.0,5.0,-5.0);
glEnable(GL_LIGHTING);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
if (counterForLights % 2 == 0) //if counter even
{
glLightfv(GL_LIGHT0, GL_POSITION,lightpos);
glLightfv(GL_LIGHT0,GL_AMBIENT,ambientlight);
glLightfv(GL_LIGHT0,GL_DIFFUSE,diffuselight);
glLightfv(GL_LIGHT0,GL_SPECULAR, specular);
glLightf(GL_LIGHT0,GL_SPOT_CUTOFF,10.0); //light 1
glLightf(GL_LIGHT0,GL_SPOT_EXPONENT,15.0);
glLightfv(GL_LIGHT0,GL_SPOT_DIRECTION,spotdir);
glEnable(GL_LIGHT0);
counterForLights++;
}
else //if counter odd
{
glLightfv(GL_LIGHT1,GL_AMBIENT,ambientlight2);
glLightfv(GL_LIGHT1,GL_DIFFUSE,diffuselight2);
glLightfv(GL_LIGHT1,GL_SPECULAR, specular2);
glLightf(GL_LIGHT1,GL_SPOT_CUTOFF,10.0);
glLightf(GL_LIGHT1,GL_SPOT_EXPONENT,15.0); //light2
glLightfv(GL_LIGHT1,GL_SPOT_DIRECTION,spotdir2);
glEnable(GL_LIGHT1);
counterForLights++;
}
counterForLights
是一个全局变量,等于 1
。它运行,但从不显示红灯,只显示蓝灯。知道我在这里出错的地方吗?
另外,如果您需要查看我的代码,请告诉我! :)
您正在启用浅色 0,然后启用浅色 1,然后永远不会再次禁用。因此,从第二帧开始,照明应该是恒定的。坚持并更新光 0 可能更聪明,或者加载系数一次,然后在任一条件分支中执行启用和禁用。
else //if counter odd
{
glLightfv(GL_LIGHT1,GL_AMBIENT,ambientlight2);
glLightfv(GL_LIGHT1,GL_DIFFUSE,diffuselight2);
glLightfv(GL_LIGHT1,GL_SPECULAR, specular2);
glLightf(GL_LIGHT1,GL_SPOT_CUTOFF,10.0);
glLightf(GL_LIGHT1,GL_SPOT_EXPONENT,15.0); //light2
glLightfv(GL_LIGHT1,GL_SPOT_DIRECTION,spotdir2);
glEnable(GL_LIGHT1);
counterForLights++;
}
看起来您没有为 LIGHT1 指定位置。
另外,我将/强烈/建议不要使用固定函数管道在OpenGL中绘图。网上有很多关于过渡到现代OpenGL的教程。
相关文章:
- OpenGL - 在抛出"__gnu_cxx::recursive_init_error"实例后终止调用?
- 了解 GLM- openGL 中的相机转换
- 如何在全屏模式下(在OpenGL中)使背景透明
- 为什么我不能使用 EGL 创建无头 OpenGl 上下文?
- OpenGL大的3D纹理(>2GB)非常慢
- OpenGl glm rotate
- C++atioglxx.pdb未加载错误glBufferData OpenGL
- OpenGL在启用深度测试时不会丢弃我的碎片
- OpenGL相机和相机空间转型的困惑
- OpenGL将纹理四边形渲染为(0,0)
- OpenGL 和 GLM 矩阵无法正确扩展,总是按比例缩小
- 发布旋转矩阵(openGL/glm)
- 如何在Visual Basic中使用矩形函数OpenGL绘制矩形
- 无法使用VAO和EBO(openGL)绘制多个对象
- 为什么我的点没有在 OpenGL 中绘制鼠标所在的位置?
- OpenGL 16 位模板缓冲区?
- 将QOpenGLWidget子类转换为使用Metal而不是OpenGL的子类是否可行?
- 在顶点着色器中使用 OpenGl 的未声明标识符,我在顶点着色器中绘制三角形时遇到问题
- 在 openGL 中多次绑定缓冲区
- opengl glBegin(GL_LINES) 和 glBegin(GL_POINT) 在 2D 中不可视化点矢量