采样深度缓冲区并归一化为[0,1](DirectX)

时间:2018-05-07 07:48:24

标签: directx-11 depth depth-buffer projection-matrix

我试图想象(用于调试目的)纹理四边形上的场景深度(我想在水面上显示水池的深度)。所以我正在做的是从相机的角度在深度缓冲区中渲染场景,然后将与着色器资源相同的深度缓冲区绑定到水着色器。但是当我对纹理进行采样时,我总能得到完整的白色纹理。我使用了pow(value, 100.0)并且我得到了一些变化,它正确地说明了水下地形的深度,所以我必须假设有一些值,但它们在1.00左右的小范围内。所以我尝试通过使用以下等式反转z的透视变换(从剪辑空间回到眼睛空间)来标准化值:

float linearDepth = near * far / (far - depth * (far - near));

但是再次,总白色。这个公式对我来说是正确的(我在Frank Luna的书中找到了它,即使我自己计算投影矩阵,我也得到它)。 远和近平面在0.1 300.0的范围内,但即使玩这些值也无法让我到处都是。

所有这一切都是因为我想在水面上实现柔化边缘并且我需要深度值,但我想在它之前想象它们,所以我知道我正确地做到了。

1 个答案:

答案 0 :(得分:0)

你是对的,使用标准投影矩阵,深度值的分布都将非常接近1的值(只有非常接近的对象才会显示出明显的差异)。除非远处飞机确实非常接近,否则你不会看到低于1的值。由于人眼看不到鲜艳颜色的小增量几乎与暗颜色之间的差异,因此也更加复杂(所以你不太能看到变化。)

您的深度缓冲线性化肯定在正确的轨道上。在过去,我得到了这个(在OpenGL中,所以YMMV)有以下几点:

float lineardepth = (2.0f * near) / (far + near - depth * (far - near));

这应该非常接近D3D中可以使用的东西。