C OpenGL地平面在某些透视图上变黑

C OpenGL地平面在某些透视图上变黑,c,opengl,lighting,C,Opengl,Lighting,我在OpenGL中有一个简单的程序,可以创建地平面、随机放置的树对象和一些闪电。闪电有一个我无法解决的问题。当相机处于某个“x”角时,闪电似乎不会影响地面,它看起来是黑色的。这是一个瞬间的变化,它不会逐渐变暗。大部分地面看起来都很亮,但在某些角度下会立即变黑。代码非常混乱,它的很多核心部分都是Lighthouse 3D上OpenGL教程的一部分,因为我正在学习OpenGL课程,这是课程的目标,学习这些教程并用它创建一些独特的东西。有人知道如何解决这个问题吗?可能是照明实施不正确?下面的代码是用于

我在OpenGL中有一个简单的程序,可以创建地平面、随机放置的树对象和一些闪电。闪电有一个我无法解决的问题。当相机处于某个“x”角时,闪电似乎不会影响地面,它看起来是黑色的。这是一个瞬间的变化,它不会逐渐变暗。大部分地面看起来都很亮,但在某些角度下会立即变黑。代码非常混乱,它的很多核心部分都是Lighthouse 3D上OpenGL教程的一部分,因为我正在学习OpenGL课程,这是课程的目标,学习这些教程并用它创建一些独特的东西。有人知道如何解决这个问题吗?可能是照明实施不正确?下面的代码是用于绘制地平面的代码

// Draw ground
glColor3f(0.039f, 0.341f, 0.078f);
glNormal3f(1.0f, 1.0f, 1.0f);
glBegin(GL_QUADS);
    glVertex3f(-1500.0f, -8.0f, -1500.0f);
    glVertex3f(-1500.0f, -8.0f,  1500.0f);
    glVertex3f( 1500.0f, -8.0f,  1500.0f);
    glVertex3f( 1500.0f, -8.0f, -1500.0f);
glEnd();
此代码用于照明

glEnable(GL_DEPTH_TEST);
glEnable(GL_CULL_FACE);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glEnable(GL_LIGHT1);
glEnable(GL_LIGHT2);
glEnable(GL_AMBIENT);
glEnable(GL_DIFFUSE);
glEnable(GL_SPECULAR);
glDisable(GL_EMISSION);
GLfloat lightpos[] = {1.0, 1.0, 7.0, 1.0};
glLightfv(GL_LIGHT0, GL_POSITION, lightpos);

GLfloat ambientLight[] = { 0.5f, 0.5f, 0.5f, 1.0f };
GLfloat diffuseLight[] = { 0.8f, 0.8f, 0.8, 1.0f };
GLfloat specularLight[] = { 0.5f, 0.5f, 0.5f, 1.0f };
GLfloat position[] = { 1250.0f, 1250.0f, 2.0f, 1.0f };
GLfloat position2[] = { -1250.0, 1250.0f, 2.0f, 1.0f};
GLfloat position3[] = { 2.0f, 1250.0f, 1250.0f, 1.0f};


glLightfv(GL_LIGHT0, GL_AMBIENT, ambientLight);
glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuseLight);
glLightfv(GL_LIGHT0, GL_SPECULAR, specularLight);
glLightfv(GL_LIGHT0, GL_POSITION, position);
glLightfv(GL_LIGHT1, GL_POSITION, position2);
glLightfv(GL_LIGHT1, GL_AMBIENT, ambientLight);
glLightfv(GL_LIGHT1, GL_DIFFUSE, diffuseLight);
glLightfv(GL_LIGHT1, GL_SPECULAR, specularLight);
//glLightfv(GL_LIGHT2, GL_POSITION, position3);
//glLightfv(GL_LIGHT2, GL_AMBIENT, ambientLight);
//glLightfv(GL_LIGHT2, GL_DIFFUSE, diffuseLight);
//glLightfv(GL_LIGHT2, GL_SPECULAR, specularLight);

奇怪的是,老的OpenGL仍然在教。无论如何,如果你必须学习,没有办法,但我建议你(如果你对OpenGL感兴趣的话)学习3.xCore及以上版本。回到你的问题上,你有没有检查灯光变黑时是否在飞机下方移动?(移动相机时灯光不移动)@t.niese不幸的是,沿Y坐标向上移动灯光并没有修复它。灯也处于一个静态位置,所以我真的不确定问题出在哪里。谢谢你!对不起,我把它表述错了。我想知道你们是否确定你们的光的位置和你们的飞机一样在世界空间中?通过更改视图矩阵来移动摄影机。如果对灯光的处理方式不同,则类似于灯光通过一根假想的棍子固定在相机上。所以光线会相对于相机移动。但是如果不了解更多的代码,就很难猜测。但很可能这就是问题所在。检查一下这个可能会对你有帮助