2017-07-25 34 views
0

作爲我的問題的簡單演示,我試圖渲染一個大而簡單的網格到稍後使用的紋理,但奇怪的是,進一步從特定角度觀看時,此網格的相機部分會從靠近相機的部分顯示。儘管不可否認的事實是我做的毫無疑問的使用深度測試:OpenGL深度排序在單個網格上失敗時,渲染到幀緩衝而不是屏幕

glEnable(GL_DEPTH_TEST); 
glDepthFunc(GL_LESS); 

舉個例子,我試圖呈現一個細分網格(在XZ平面)爲中心的起源,具有光滑的「山」在電網中間。

當呈現給沒有錯誤發生屏幕和網狀看起來像這樣(渲染使用正投影,並且與灰度顏色代表深度,即使網由任何一側觀察將進一步發生錯誤):

Rendering directly to screen, no errors occur, even when mesh is rotated

渲染到屏幕當然是通過確保幀緩衝區設置爲0(glBindFramebuffer(GL_FRAMEBUFFER, 0);)來完成的,但我需要渲染這個場景到另一個場景的幀緩衝這是不是我的屏幕,才能使用此渲染作爲紋理。
所以我已經設置了另一個framebuffer和一個輸出紋理,現在我正在將這個場景重新渲染到framebuffer(除了framebuffer和視口大小設置爲與輸出紋理相匹配外,沒有任何更改)。爲了演示我正在嘗試的錯誤,然後將該渲染的紋理渲染到屏幕上顯示的平面上。

當網格從正x軸旋轉看,並圍繞y軸旋轉時,以其原點爲中心在-0.5π弧度和0.5π弧度之間,呈現的紋理看起來與渲染到屏幕,如上圖所示。

然而,當圍繞y軸旋轉大於0.5π弧度或小於-0.5π弧度時,更靠近相機的小山位於離相機更遠的平面之後(事實上這山更接近攝像機可以通過看顏色,它代表debth)得到證實:

enter image description here

(哎呦得到了標題錯了窗戶上,忽略了)

在繞y軸旋轉的邊界區域接近0.5π弧度或-0.5π弧度,場景看起來像這樣。

enter image description here

(哎呦再次拿到了冠軍錯誤的窗口上,再次忽略)

回顧一下。只有在使用幀緩衝區渲染到紋理時,以及僅當從特定角度查看對象時,纔會發生深度排序錯誤。當對象直接渲染到屏幕上時,不會發生錯誤。我的問題是:爲什麼會發生這種情況,以及如何(如果有的話)我可以避免避免它。

+0

第一張照片......看起來不像一個正交投影。它看起來像一個透視投影給我。 –

回答

1

如果只有在渲染到紋理幀緩衝區時纔會出現此問題,那麼您可能沒有正確鏈接到該紋理的深度附件。

確保在FBO init期間,您還將它鏈接到深度紋理。 有一個很好的例子,如何做到這一點here

另外,檢查你用來渲染的所有矩陣 - 過去我曾經有過幾種不正確的矩陣拋出深度計算的例子。

+0

這是深度紋理/緩衝區沒有鏈接到右邊的framebuffer。 – Nikolaj

相關問題