2011-09-22 28 views
2

這可能是一個簡單的問題。作爲GLSL的新手,我寧願在這裏問。 現在,在頂點着色器,我可以在世界座標系的位置以下列方式:[GLSL]如何比較世界座標中所有頂點的z值?

gl_Position = ftransform(); 
    posWorld = gl_ModelViewMatrix * gl_Vertex; 

的問題是:現在可以我可以將所有的頂點之間的posWorld的最大/最小值?所以我可以得到一個頂點深度的範圍,但不是深度緩衝區的範圍。

如果這是不可能的,我怎樣才能得到世界座標系中的近/遠平面的z值?

與問候,

+0

'gl_ModelViewMatrix'進入_view_空間,而不是世界空間。這就是爲什麼它被稱爲「模型視圖」:它從模型到視圖。 –

回答

2

是的,它可以用OpenGL。我正在做一個類似的技術來計算GPU上的對象邊界框。以下是步驟:

  1. 在其自己的FBO中排列大小爲1x1類型RGBA_32F的呈現緩衝區。設置爲渲染目標(沒有深度/模板,只有一個顏色平面)。它可以是更大紋理的像素,在這種情況下,您需要正確設置視口。
  2. 用基本值清除。對於'分'這將是一個巨大的數字,因爲'最大'它是負面的巨大。
  3. 相應地用係數(1,1)設置混合函數'min'或'max'。
  4. 使用着色器繪製網格,該着色器會生成帶(0,0,0,1)座標的點。輸出包含原始頂點世界位置的顏色。

您可以從這裏進一步優化。例如,您可以通過使用幾何着色器和取消其中一個輸出像素的位置,在一次繪製調用中同時獲得'min'和'max'。

+0

感謝您的回答:DI正在嘗試在着色器中執行此操作...我並沒有完全明白你的意思。:( – superpanda

+0

我一步一步解釋你最初的要求和@Cristobal認爲不可能的事情。如前所述,這個方案在我的引擎中用於更新邊界框。重點是:它的工作原理。如果你不理解它,請提出更具體的問題(如果仍然感興趣)。 – kvark

+0

我正在使用xip構建器,我可以做的是通過加載我自己的着色器文件(頂點着色器和片段着色器)來替換標準着色器。我正在處理體積數據而不是網格。這將有可能讓你的方法在着色器中工作嗎?謝謝:D – superpanda

1

據我所知,我想這需要基於並行還原算法手動完成。我希望有人確認是否存在已經執行此操作的OpenGL或GLSL函數。

另一方面,您可以訪問片段着色器中的歸一化近/遠平面,即 http://www.opengl.org/wiki/GLSL_Predefined_Variables#Fragment_shader_uniforms
和一些統一變量的幫助下,你可以得到遠近的世界。

+0

謝謝你的回答。你能否給我一個關於哪些均勻變量用於從規範化的近/遠向世界近/遠變換的暗示? – superpanda

+1

@superpanda這裏只列出了3個統一值,您可以使用* all *。問題是,如果你想要查看空間,你需要的不僅僅是這些。你需要你的投影矩陣,對於初學者(或者說反過來說)。老實說,傳遞它會容易得多。那些近值和遠值是從你使用'glFrustum'或'gluPerspective'的視圖空間近值和遠值得到的。 –

+0

是按照Nicol的建議通過投影矩陣。 – labotsirc

相關問題