【发布时间】:2019-11-24 08:11:29
【问题描述】:
我刚刚实现了 nVidia 可爱的 GPU Gems 3 书中的“上帝射线”着色器:Volumetric Light Scattering as a Post-Process。
无论如何,它几乎是完美的,除了一个缺陷。不知何故,灯光的位置并没有随着场景的其余部分移动。
图片示例:
这看起来和它应该的完全一样。
这不是。光应该从白色球体向外辐射,但看起来位置与第一张图片没有变化。
我正在顶点着色器中进行转换:
uniform vec4 light_coords;
varying vec2 light_pos;
void main()
{
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
gl_TexCoord[0] = gl_MultiTexCoord0;
light_pos = vec2(gl_ModelViewProjectionMatrix * light_coords) * 0.5 + 0.5;
}
这是正确的吗?
世界坐标中光的位置是 (0, 0, -2) 错误完全有可能在代码中的其他地方,但我想在深入研究之前确保我在顶点着色器中的计算是正确的剩下的。
编辑:我根据下面 Nicol Bolas 的建议做了一些更改,效果更好,但仍然不对。
当相机位于其原始位置时,它看起来仍然很好,但是当我旋转场景时,看起来计算出的灯光位置现在离左侧太远了。
这是我正在使用的 GLSL 代码:
uniform vec4 light_coords;
uniform mat4 light_modelview;
varying vec2 light_pos;
void main()
{
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
gl_TexCoord[0] = gl_MultiTexCoord0;
light_pos = vec2(gl_ProjectionMatrix * light_modelview * light_coords) * 0.5 + 0.5;
}
light_modelview在这里获取:
glPushMatrix()
glTranslatef(self.position[0], self.position[1], self.position[2])
glScalef(2, 2, 2)
self.modelview = glGetFloatv(GL_MODELVIEW_MATRIX)
glCallList(self.sphere)
glLightfv(self.light_id, GL_POSITION, self.position)
glPopMatrix()
position 是 [0, 0, -2]。它作为light_coords 传递到着色器中
理想情况下,如果light_pos 在屏幕上,我希望它位于 (0, 0) 到 (1, 1) 之间的任何位置,如果它不在屏幕上,则大于或小于该值。
任何线索我做错了什么?我对 OpenGL 还是有点陌生,所以我有点不确定是做什么的。
【问题讨论】: