我目前从场着色器的一个后处理深度的深度纹理使用以下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
值作为距离,但这似乎没有工作。这里的正确方法是什么?
此外,当使用斜截头截头将近平面移到选定的截取平面上时,近平面距离现在可能对每个像素有所不同?如果是这样,那么这是否意味着任何计算距深度纹理的距离的着色器都需要知道这种情况,而不是假设常量接近平面距离?
谢谢!
我的确有相反的问题,所以你的问题陈述最终成为我的解决方案。谢谢, – imallett 2013-05-31 20:38:56