gpt4 book ai didi

opengl - GLSL - 从世界坐标计算屏幕坐标无法正常工作

转载 作者:行者123 更新时间:2023-12-02 06:39:13 26 4
gpt4 key购买 nike

我刚刚实现了 nVidia 可爱的 GPU Gems 3 书中的“god-ray”着色器:Volumetric Light Scattering as a Post-Process .

无论如何,除了一个缺陷之外,它几乎是完美的。不知何故,灯光的位置没有随场景的其余部分移动。

图片示例:

这看起来完全符合预期。

enter image description here

这不是。光线应该从白色球体向外辐射,但看起来位置与第一张图片没有变化。

enter image description here

我正在顶点着色器中进行转换:

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) 错误完全有可能是在代码中的其他地方,但我想在深入研究之前确保顶点着色器中的计算是正确的其余的。

编辑:我根据下面尼可波拉斯的建议做了一些更改,效果更好,但仍然不正确。

当相机位于原始位置时,它看起来仍然很好,但是当我旋转场景时,计算出的灯光位置现在看起来离左侧太远了。

enter image description here

这是我正在使用的 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()

位置[0, 0, -2]。它作为 light_coords

传递到着色器

理想情况下,如果 light_pos 在屏幕上,我希望它位于 (0, 0) 到 (1, 1) 之间的任何位置,如果它不在屏幕上,则大于或小于该值。

知道我做错了什么吗?我对 OpenGL 还比较陌生,所以我有点不确定什么是做什么的。

最佳答案

如果 light_coords 位于世界空间中,则只有当 gl_Vertex时,将其乘以 gl_ModelViewProjectionMatrix 才有意义> 在世界空间中。不知怎的,我怀疑是这样。

一般来说,您不会传递光线方向或任何 light_coords 应该位于世界空间中的内容。您将其传递到 View 空间中。您从世界空间转换到 CPU 上的 View 空间,并将 View 空间坐标放入着色器中。

关于opengl - GLSL - 从世界坐标计算屏幕坐标无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8516261/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com