我刚刚从nVidia的可爱的GPU Gems 3书:Volumetric Light Scattering as a Post-Process中实现了“ god-ray”着色器。
无论如何,除了一个缺陷,它几乎是完美的。不知何故,灯光的位置不会随场景的其余部分一起移动。
图片示例:
看起来完全正确。
<< img src =“ https://image.soinside.com/eyJ1cmwiOiAiaHR0cHM6Ly9pLnN0YWNrLmltZ3VyLmNvbS9HNnR3Zi5wbmcifQ==” alt =“在此处输入图像描述”>
这不是。光线应该从白色球体向外辐射,但看起来位置与第一张图片相比没有变化。
<< img src =“ https://image.soinside.com/eyJ1cmwiOiAiaHR0cHM6Ly9pLnN0YWNrLmltZ3VyLmNvbS9JaGIxOC5wbmcifQ==” alt =“在此处输入图像描述”>
我正在顶点着色器中进行变换:
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)完全有可能该错误在代码中的其他位置,但是我想确保在进入顶点着色器之前,我在顶点着色器中的计算是正确的其余的。
EDIT:
我根据下面的Nicol Bolas的建议进行了一些更改,虽然更好,但仍然不正确。当照相机位于其原始位置时,它看起来仍然不错,但是当我旋转场景时,看起来计算出的光线位置现在离左侧太远了。
<< img src =“ https://image.soinside.com/eyJ1cmwiOiAiaHR0cHM6Ly9pLnN0YWNrLmltZ3VyLmNvbS9kQkFjbi5wbmcifQ==” alt =“在此处输入图像描述”>
这是我正在使用的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的新手,所以我有点不确定做什么。
我刚刚实现了nVidia的可爱的GPU Gems 3书中的“上帝射线”着色器:作为后处理的体积光散射。无论如何,它几乎是完美的,除了一个缺陷。 ...
如果light_coords
在世界空间中,则将其乘以gl_ModelViewProjectionMatrix
仅在gl_Vertex
在世界空间中为也