我有一个延迟渲染器,看起来工作正常,深度、颜色和阴影都正确。然而,当使用透视投影时,位置缓冲区对于正交投影是正常的,但几何体似乎“反转”(或者深度被禁用)。
对于正交投影,我得到以下缓冲输出。
对于正交投影,我得到以下缓冲输出。
目前最终的“阴影”图像看起来正确。
然而,当我使用透视投影时,会得到以下输出缓冲区...最后的图片很好,尽管目前我没有整合任何位置缓冲区信息(注:目前仅进行“车头灯”着色)。
虽然最终图像看起来正确,但是我的位置缓冲似乎忽略了深度缓冲区...(代码中没有 glDisable(GL_DEPTH_TEST)。深度和法线缓冲区看起来没问题,只有“位置”缓冲区似乎忽略了深度?正交和透视的渲染管道完全相同,唯一的区别是投影矩阵。我使用 glm::ortho 和 glm::perspective,并根据场景 AABB 实时计算近/远裁剪距离。对于正交投影,我的近/远分别为 1 和 11.4734,对于透视投影,它们分别为 11.0875 和 22.5609... 宽度和高度值相同,透视投影的 fov 为 45。在绘制任何几何图形之前,我确实调用了这些函数...glEnable(GL_DEPTH_TEST);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
我将其用于合成渲染管道的不同层。
我有做错什么吗?或者我有什么误解吗?
这是我的着色器...... gBuffer 的顶点着色器...
#version 430 core
layout (std140) uniform MatrixPV
{
mat4 P;
mat4 V;
};
layout(location = 0) in vec3 InPoint;
layout(location = 1) in vec3 InNormal;
layout(location = 2) in vec2 InUV;
uniform mat4 M;
out vec4 Position;
out vec3 Normal;
out vec2 UV;
void main()
{
mat4 VM = V * M;
gl_Position = P * VM * vec4(InPoint, 1.0);
Position = P * VM * vec4(InPoint, 1.0);
Normal = mat3(M) * InNormal;
UV = InUV;
}
#version 430 core
layout(location = 0) out vec4 gBufferPicker;
layout(location = 1) out vec4 gBufferPosition;
layout(location = 2) out vec4 gBufferNormal;
layout(location = 3) out vec4 gBufferDiffuse;
in vec3 Normal;
in vec4 Position;
vec4 Diffuse();
uniform vec4 PickerColour;
void main()
{
gBufferPosition = Position;
gBufferNormal = vec4(Normal.xyz, 1.0);
gBufferPicker = PickerColour;
gBufferDiffuse = Diffuse();
}
这是“第二遍”着色器,用于可视化位置缓冲区...
#version 430 core
uniform sampler2D debugBufferPosition;
in vec2 UV;
out vec4 frag;
void main()
{
vec3 val = texture(debugBufferPosition, UV).xyz;
frag = vec4(val.xyz, 1.0);
}
我还没有使用位置缓冲数据,但我知道我可以在不必将它们存储在另一个缓冲区中的情况下重建它们,然而,对于其他原因,这些位置对我很有用,我想知道为什么它们在透视图中是这样的?
glReadPixels
与位置图像进行查询而不必在CPU上执行转换(尽管我现在有些犹豫,因为我有很多空闲的GPU周期),但也可能有助于SSAO。对于此,直接将位置存储在视图/眼睛(剪辑)空间中是否更好?非常感谢。 - lfgtm