我目前正在使用以下 GLSL 代码在后处理景深着色器中读取深度纹理:
vec4 depthSample = texture2D(sDepthTexture, tcScreen);
float depth = depthSample.x * 255.0 / 256.0 +
depthSample.y * 255.0 / 65536.0 +
depthSample.z * 255.0 / 16777216.0;
然后根据近、远平面距离将深度值转换为视空间距离:
float zDistance = (zNear * zFar) / (zFar - depth * (zFar - zNear));
这一切似乎都运行得很好,但是我很想知道如何仅基于当前投影矩阵进行上述计算,而不需要单独的zNear
和zFar
值。
我最初的尝试涉及乘以(vec4(tcscreen.x, tcScreen.y, depth, 1.0) * 2.0 - 1.0)
投影矩阵的倒数,将结果除以w
,然后将结果z
值作为距离,但这似乎不起作用。这里的正确方法是什么?
此外,当使用斜截头截体剪裁将近平面移动到选定的剪裁平面上时,现在每个像素的近平面距离是否可能不同?如果是这样,那么这是否意味着任何计算与深度纹理的距离的着色器都需要了解这种情况,而不是假设一个恒定的近平面距离?
谢谢!