簡體   English   中英

增加遠離相機的深度緩沖精度

[英]Increasing depth buffer precision far from the camera

我有一個正在研究的項目是從模擬中制作電影。 模擬從另一個定義投影矩陣的程序傳遞。

我遇到的問題是另一個程序有一種“假的”正交視圖,我的意思是它的投影矩陣如下:

PerspectiveMatrix = glm::perspective(3.5, 1, 1.0f, 50.0f); 

它使用LookAt函數:

ViewMatrix = glm::lookAt(
    (2000,-3000,2000), // eye 
    (0,0,0), // center 
    (0,0,1)//up 
);

所以我的意思是'假的'正交視圖是他們已經將相機定位得足夠遠(和小角度來放大場景),“視線”(缺少更好的術語)幾乎是平行的正投影。

所以這一切都很好,但是我遇到了,並且在另一個程序中也是一個問題,就是所有的高精度深度測試都靠近相機,在我的情況下,這是空的空間。 這意味着有很多z戰斗,如下面的鏈接所示:

截圖

所以我的問題是我可以通過哪些方式更改深度測試,以便將緩沖區偏向遠方平面? 或類似的規定。 我已經嘗試將NearPlane移動得更遠,這會導致屏幕縮小,所以我在視角中用較窄的角度進行補償。 但是這樣做足夠的時間會使問題變得更糟,沒有z戰斗,但它並沒有在正確的深度上繪制東西。 球體最終位於一切之上。

我確實在Outerra找到了一些信息: http ://outerra.blogspot.com/2012/11/maximizing-depth-buffer-range-and.html他們有一些想法可以反轉深度緩沖區,但它是Nvidia特有的,我需要與ATI和Nvidia兼容

博客文章中描述的對數深度和反向深度映射都適合您。

反向浮點更好,它在DirectX中正常工作。 在OpenGL中,由於設計缺陷,它不會為您帶來任何額外的精度,除非驅動程序暴露NV_depth_buffer_float擴展,通過該擴展可以有效地關閉使其無法正常使用的偏差。

AMD自13.12 Catalyst驅動程序以來就支持該擴展,因此該技術可用於所有5000+系列AMD GPU(驅動程序不支持舊系列)。

比上述任何一個都簡單:將你的znear從相機移開。 看起來它是glm :: perspective()的第三個參數,在你的例子中設置為1.0。 在開始剪切場景前景中的內容之前,將其設置為盡可能大,並且z緩沖區精度問題可能會消失。

Reverse-float-z非常棒,但只有具有更寬視野和更深幾何形狀的場景才真正需要。 對於像你這樣的近似正交場景,只需適當設置你的znear / zfar。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM