2014-06-06 35 views
4

我想用GL_LINE_STRIP繪製平截體體。這些圓錐頂點的座標是什麼?我有模型視圖和投影矩陣。是否有可能使用這些矩陣計算着色器本身的座標?如何在opengl中繪製平截頭體

+0

在什麼空間你想繪製你的視錐?這是用於某種概述/提示嗎? – derhass

+0

@derhass世界空間。 – debonair

回答

4

如果您想爲平截頭角的世界空間座標,您需要做的就是投射NDC空間中的8個角點(每個角度從-1到1,因此角點很容易枚舉)回到世界空間。但是,不要忘記,你必須w劃分:

c_world = inverse(projection * view) * vec4(c_ncd, 1); 
c_world = c_world*1.0/c_world.w; 

雖然我寫這在GLSL語法,這意味着僅僞代碼。你可以用可以在着色器中做,但這意味着它必須被多次計算(取決於你把它放在哪個着色器階段)。至少預先計算CPU上的反轉矩陣通常要快得多。

+0

你能解釋你的答案嗎? – debonair

+2

@debonair:你在NDC空間(這是'vec4(clip_space.xyz/clip_space.w,1.0/clip_space.w)')的視角的角落都是** - 1 **和** 1的組合**。對於3維,您需要使用** - 1 **和** 1 **的2^3 = 8個組合來查找NDC中的所有角落。一旦你有了,乘以你的逆向投影矩陣來獲得剪輯空間和逆向視圖矩陣以達到世界空間(可以像derhass所展示的那樣組合成一個單獨的步驟)。順便說一句,用'w'劃分是產生平截頭體形狀的東西 - 如果你把它留下來,你就有一個立方體。 –

+0

@debonair:我在那個評論中犯了一個錯字,但是這個想法是一樣的......逆向投影矩陣會帶你到視圖空間(從剪輯空間開始)。你實際上會跳過那個座標空間,所以它並不重要,但我可以更正確地說:P –