2013-06-29 14 views
1

在我的延迟渲染器中,深度缓冲区保存的值范围从约0.97001.0000。我通过在给定深度范围内绘制黑色像素来发现这一点。这是我使用的着色器代码。为什么我的深度值在这个怪异的范围内?

bool inrange(in float position) 
{ 
    float z = texture2D(depth, coord).r; 
    return abs(position - z) < 0.0001; 
} 

void main() 
{ 
    if(inrange(0.970)) image = vec3(0); 
    else result = texture2D(image, coord); 
} 

这就是它的样子。我尝试了几个深度值。此图像适用于深度值0.998

screenshot

我使用作为GL_DEPTH24_STENCIL8类型的质地和作为深度和模板附件格式GL_FLOAT_32_UNSIGNED_INT_24_8_REV

是否有我的深度值在这个范围内的解释?它是默认行为吗?我希望他们在0.00001.0000的范围内。

回答

2

听起来像一个非常接近原点的剪切面附近的透视图。在构建透视矩阵时,尽量设置尽可能远离原点的近剪裁。

+0

我的裁剪平面位于'0.1f'和'1000.0f'。但是我需要靠近的飞机,以便靠近玩家的物体不会被切断。但是,我能纠正深度范围吗?我完全不理解背后的数学。 – danijar

+0

@danijar:近平面如此接近导致你的问题。在透视投影中,Z值非线性地映射到深度值,具体而言,它是d(z)α1/z,这意味着对于非常接近的平面,您将所有深度精度压缩到离原点非常小的距离。 – datenwolf

+0

如果对象真的让观众关闭,有几种策略。第一个策略*多通道渲染*:使用通常的投影渲染世界和远处的物体。对于比特定阈值更接近的所有对象,通过仅清除深度缓冲区来执行第二遍。然后用不同深度范围的投影呈现更近的物体。 – datenwolf

相关问题