GLSL-根据世界坐标无法计算屏幕坐标

问题描述 投票:3回答:1

我刚刚从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书中的“上帝射线”着色器:作为后处理的体积光散射。无论如何,它几乎是完美的,除了一个缺陷。 ...

opengl glsl shader
1个回答
4
投票

如果light_coords在世界空间中,则将其乘以gl_ModelViewProjectionMatrix仅在gl_Vertex在世界空间中为

© www.soinside.com 2019 - 2024. All rights reserved.