我目前正在使用以下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
值作为距离,但这似乎不起作用。这里的正确方法是什么?
此外,当使用斜截体裁剪将近平面移动到所选裁剪平面时,每个像素的近平面距离现在是否可能不同?如果是,那么这是否意味着任何从深度纹理计算距离的着色器都需要了解这种情况,并且不能假设一个恒定的近平面距离?
谢谢!