您的方法有两个问题:
你假设深度在[0,1]的范围内,你可以使用它 clipPos.z / clipPos.w ,它是[-1,1]范围内的NDC z坐标。通过直接将窗口空间z坐标写入深度纹理(可能是[0,1]中),您可能会更好 gl_FragCoord.z 。
clipPos.z / clipPos.w
gl_FragCoord.z
您假设线性深度映射的更严重的问题。但事实并非如此。 NDC和窗口空间z值不是到相机平面的距离的线性表示。您在屏幕截图中看到的任何内容都非常接近于1并不奇怪。典型的雾计算是在眼睛空间进行的。但是,因为你只需要 z 在这里coord,你只需存储剪辑空间 w ^ 坐标 - 因为通常,这只是 -z_eye (查看投影矩阵的最后一行)。但是,结果值不会在任何规范化的范围内,而是在投影矩阵中使用的[near,far] - 但是在眼睛空间单位中指定雾距离(通常与世界空间单位不同)更直观。
z
-z_eye