【问题标题】:GLSL - Computing screen coordinates from world coordinates not working properlyGLSL - 从世界坐标计算屏幕坐标无法正常工作
【发布时间】: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 还是有点陌生​​,所以我有点不确定是做什么的。

【问题讨论】:

    标签: opengl glsl shader


    【解决方案1】:

    如果light_coords 在世界空间中,那么将其乘以gl_ModelViewProjectionMatrix 仅在gl_Vertex 也是 在世界空间中时才有意义。不知何故,我怀疑它是。

    一般情况下,您不会传递光线方向或 light_coords 应该在世界空间中的任何内容。你在视图空间中传递它。在 CPU 上从世界空间转换到视图空间,并将视图空间坐标放入着色器中。

    【讨论】:

    • 嗯。有没有一种有效的方法来进行这种转变?我正在使用 OpenGL 的 Python 绑定,所以我想尽可能多地保留在着色器或一些 OpenGL 调用中。
    • @DaneLarsen:您每帧执行一次。我确信你的 CPU 可以处理每帧一次的矩阵乘法,即使在 Python 中也是如此。我会告诉你如何在着色器中做到这一点,但我担心你只会这样做,而不是把它放在 CPU 上,看看它对任何事情的影响是多么小。此外,它需要明确使用世界空间矩阵,这在 GPU 上绝不是一件好事。
    • 很公平。我明天试试。感谢您的帮助!
    猜你喜欢
    • 2012-08-14
    • 2018-01-29
    • 2017-12-11
    • 2017-05-26
    • 2014-12-28
    • 1970-01-01
    • 1970-01-01
    • 2021-10-22
    相关资源
    最近更新 更多