2013-06-29 20 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

相關問題