旧版openGL -灯光错误地以gloulookat方向移动

7kqas0il  于 2023-08-04  发布在  其他
关注(0)|答案(2)|浏览(124)

我正在寻求帮助,因为我有一个困难的时候,试图绘制一个固定的聚光灯在我的网格渲染。我现在正在做的事情是:

gluLookAt(...)
DrawMesh(...)
float pos[] = {0, 500, 0, 1};
glLightfv(GL_LIGHT0, GL_POSITION, pos);

字符集
在这里我初始化灯光:

float ambient_light[] = {1, 1, 1, 1.0};
glLightfv(GL_LIGHT0, GL_AMBIENT, ambient_light);

GLfloat cutoffAngle = 30.0f;
glLightf(GL_LIGHT0, GL_SPOT_CUTOFF, cutoffAngle);

GLfloat spotDirection[3] = {0.0f, -1.0f, 0.0f};
glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, spotDirection);

GLfloat exponentValue = 10.0f;  // Example value
glLightf(GL_LIGHT0, GL_SPOT_EXPONENT, exponentValue);


在变换后定义灯光应该提供相对于我的相机PoV的固定灯光。问题是聚光灯仍然相对于相机平移,但随着相机旋转/方向而变化!Here's a gif发生了什么已经两天了,我还没能克服这个问题!如果需要,我会分享更多的代码。感谢您阅读本文。
(note我被迫坚持使用遗留的OpenGL,因为这是一个学术项目)
我已经尝试过改变modelview函数和灯光调用的顺序,设置不同的灯光属性,并使用网格法线。预期的行为应该包括即使在移动相机方向时光也保持静止。

6tr1vspr

6tr1vspr1#

根据规范:
当调用glLight时,位置由modelview矩阵转换(就像它是一个点一样),并存储在眼睛坐标中。Blockquote
因此,这里的问题是灯光位置被gluLookAt()创建的modelview矩阵转换。您可以通过调用glLoadIdentity()重置modelview矩阵。如果以后要渲染更多内容,您可能需要使用glPushMatrix()glPopMatrix()来恢复矩阵。
假设在你的modelview矩阵中有一些平移,以使对象进入眼睛空间,例如。具有非零眼坐标的gluLookAt()。您可能需要在glLoadIdentity()之后恢复该转换。

thtygnil

thtygnil2#

引用Reddit的一个回答,解决了我的问题:

  • 我认为问题在于所有接受向量的glLightfv()调用都使用当前的ModelViewMatrix。由于您设置聚光灯方向的调用在绘制循环之外,因此MVM可能是当时的标识。尝试将draw()中的GL_SPOT_DIRECTION设置移动到您设置位置的旁边。或者两个调用都必须在外部,我不确定矩阵在这种模式下如何工作。无论如何,将它们设置在不同的位置几乎肯定是问题的一部分。

相关问题