2013-02-23 78 views
7

在背面剔除中,您可以使用臉部法線來查看臉部是否指向遠離相機的位置,如果三角形繪製爲時鐘明智或計數器時鐘明智。什麼是openGL中的順時針臉

我對順時針方向的這種技術感到困惑。對於這種方法來說,發送給顯卡的頂點數據的排序決定了它是朝向還是遠離相機。我不明白這是否合理,因爲相機可以朝任何方向觀看,就好像頂點數據必須根據相機位置改變,這顯然不是在CPU上完成的。

我怎麼理解這個?

+0

關於數學的相關問題:http://math.stackexchange.com/questions/297588/for-bsp-generation-how-to-intersect-or-locate-a-triangle-with-a-plane-定義-b/297905#297905 – 2013-02-25 17:41:07

回答

10

這是從相反側觀看的一個三角形:在三維空間中

clockwise vs counterclockwise

3點限定一個三角形。另外,如果這些點是有序的(如這裏),它們也決定了三角形的兩個面(面):順時針和逆時針(它們由放在面內的順序時鐘確定將指向它的頂點)

在上面的例子中的三角形紋理逆時針

現在想象一下,這個三角形是一個骰子的元素:

ccw textured box

如果擲骰子(或旋轉攝像頭周圍)我們從CCW三角形會變成CW,我們不希望它再被紋理化。

這個骰子實際上是由12個這樣的三角形構成的,如果我們正確地命令它們,我們將只有6個紋理每次都面對相機。

+1

只是想補充一點,這也被稱爲* chirality *,或者指向性,並且座標系的手徵性也決定了正常點的方向,這取決於您將矢量放置在十字中的順序產品。聲明'a×b = -b×a'總是成立,但翻轉手徵也有同樣的效果。 – datenwolf 2013-02-23 15:02:50

+0

,所以CW或CCW的順序告訴GPU哪一面在前面,但我不明白這是如何實現的,因爲相機的方向決定了面部是朝向還是遠離。 – 2013-02-23 15:05:23

+0

。這是整個觀點。在上面的圖像攝像機的左側是在該三角形的後面,在右側的位置是在它的前面。而你只想紋理一面。 – fsw 2013-02-23 15:09:37

5

我會告訴你這上一個例子四:

(0,0)-------(1,0) 
    |   | 
    |  X  | 
    |   | 
    (0,1)-------(1,1) 

假設我們已開始在(0,0)。現在,如果您按照「順時針」順序結束(傳遞)頂點,則下一個將是(1,0),(1,1)(0,1)(1,0) 2點多或少,(1,1)爲4,依此類推。

因此GPU內存中的數據:0,0, 1,0, 1,1, 0,1

當您將發條方向與您的設置相關聯時,您可以輕鬆區分什麼是「前」和「後」 - 想象得更好,您可以將其繪製在透明的物體上,然後從另一側看 - 向上的方向將被顛倒。

因此,卷繞方向的規格僅僅是告訴GPU哪一面是前面,哪一面是背面,因爲它本身無法做到 - 三角形的兩邊同樣好,法向矢量給定的多邊形可以是N-N。但是,GPU可以驗證其中哪些與適當的清盤順序一致。

The (Old) Red Book的第2章有關於OpenGL特定的東西的一些很好的解釋,今天仍然非常相關。

+0

所以CW或CCW的順序告訴GPU哪一面在前面,但我不明白這是如何實現的,因爲相機的方向決定了面部是朝向還是遠離。 – 2013-02-23 15:02:47

+0

這就是要點。如果你從後面「看」臉部,他們可以在繪畫中被忽略,因爲它們肯定會被前臉所遮擋(透明模特是個例外 - 在這種情況下,前臉和後臉都必須是畫)。 – 2013-02-23 15:13:33

1

這正是關鍵點:頂點順序不必與相機方向最初,當您創建/繪製的臉!請注意,相機僅僅是一種轉換,而不是由openGL本身識別的東西。因此,在渲染時,在通過攝像機「觀察」之後,openGL僅檢查(如果啓用了剔除)臉部頂點的新順序,現在根據新方向(在應用了所有變換之後) ,以顯示臉部或不。