我正在寻求帮助,因为我有一个困难的时候,试图绘制一个固定的聚光灯在我的网格渲染。我现在正在做的事情是:
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函数和灯光调用的顺序,设置不同的灯光属性,并使用网格法线。预期的行为应该包括即使在移动相机方向时光也保持静止。
2条答案
按热度按时间6tr1vspr1#
根据规范:
当调用glLight时,位置由modelview矩阵转换(就像它是一个点一样),并存储在眼睛坐标中。Blockquote
因此,这里的问题是灯光位置被
gluLookAt()
创建的modelview矩阵转换。您可以通过调用glLoadIdentity()
重置modelview矩阵。如果以后要渲染更多内容,您可能需要使用glPushMatrix()
和glPopMatrix()
来恢复矩阵。假设在你的modelview矩阵中有一些平移,以使对象进入眼睛空间,例如。具有非零眼坐标的
gluLookAt()
。您可能需要在glLoadIdentity()
之后恢复该转换。thtygnil2#
引用Reddit的一个回答,解决了我的问题: