簡體   English   中英

如何使用深度緩沖區的OpenGL正交投影?

[英]How to use OpenGL orthographic projection with the depth buffer?

我使用glFrustum()透視模式渲染了3D場景。 然后,我將一個2D對象放在3D場景上,作為特定3D對象的標簽。 我使用gluProject()計算了3D對象的2D位置,然后放置我的2D標簽對象。 使用glOrtho()正交模式渲染2D標簽對象。 這完美地工作,並且2D標簽對象懸停在3D對象上。

現在,我想要做的是給2D對象的az值,以便它可以使用深度緩沖區隱藏在場景中的其他3D對象后面。 我已經給出了我知道應該被深度緩沖區隱藏的2D對象az值,但是當我渲染對象時它總是可見的。

所以問題是,為什么2D對象仍然可見而不是隱藏?

我確實在某處讀過正交和透視投影存儲不兼容的深度緩沖值。 這是真的,如果是這樣,我如何在它們之間進行轉換?

我不希望它被轉換,而是我希望它看起來像是平面的2D標簽,它總是面向相機,並且始終保持在屏幕上的相同尺寸。 但是,如果隱藏在某些東西背后,我希望它隱藏起來。

首先,你應該把放在你的問題中; 它解釋了你所做的比你的問題更多的事情。

要實現這一點,您需要做的是在正交投影中找到與您希望標簽出現的前投影空間中的z坐標匹配的z坐標。

當你使用gluProject ,你有三個坐標。 Z坐標很重要。 您需要做的是根據您給glOrtho的zNear和zFar值反向變換Z坐標。

迂腐: gluProject不會將Z坐標轉換為窗口空間。 為此,它必須采用glDepthRange參數。 它真正做的是假設深度范圍接近= 0.0且遠= 1.0。

所以我們的第一步是從窗口空間Z轉換為規范化設備坐標(NDC)空間Z.我們使用這個簡單的等式:

ndcZ = (2 * winZ) - 1

很簡單。 現在,我們需要去剪輯空間。 這是一個無操作,因為使用正交投影,W坐標假定為1.0。 W的除法是剪輯空間和NDC空間之間的差異。

clipZ = ndcZ

但是我們不需要剪輯空間Z.我們需要預拼圖投影空間Z(又名:相機空間Z)。 這需要你給glOrtho的zNear和zFar參數。 為了獲得相機空間,我們這樣做:

cameraZ = ((clipZ + (zFar + zNear)/(zFar - zNear)) * (zFar - zNear))/-2

而且你已經完成了。 在渲染中使用Z位置。 哦,並確保您的模型視圖矩陣不包括Z方向上的任何變換(除非您使用模型視圖矩陣將此Z位置應用於標簽,這很好)。

基於Nicol的答案,您可以簡單地將zNear設置為0(這通常對於作為GUI一部分的2D元素有意義),然后您只需:

cameraZ = -winZ*zFar

暫無
暫無

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

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