2013-01-18 72 views
2

我想用Stage3D的AGAL編寫的着色器程序創建線框效果。如何將重心座標傳遞給AGAL着色器? (AGAL線框着色器)

我一直在谷歌搜索,我明白,我可以確定一個像素是多麼接近一個三角形的邊緣使用barycentric coordinates(BC)通過頂點程序傳遞到片段程序,然後相應的顏色,如果它足夠接近。

我的困惑在於用什麼方法將這些信息傳遞給着色器程序。我有一個簡單的例子,設置了一個立方體,8個頂點和一個索引緩衝區,以在使用它們之間繪製三角形。

如果我是放置卑詩省到頂點緩衝區,這是沒有意義的,因爲他們需要根據其三角形被渲染成不同的;例如使用Vetex2和Vetex3渲染時,Vetex1可能需要(1,0,0),但使用Vetex5和Vetex6渲染時,Vetex1可能需要(1,0,0)。也許我不完全理解這個方法。

我是否需要複製頂點位置並將頂點數據添加到頂點緩衝區中,實際上每個三角形產生3個頂點並將頂點數加倍? 我是否總是給頂點一個(1,0,0),(0,1,0)或(0,0,1)值或者這只是一個例子? 我是否在複雜這一點,是否有更簡單的方法來執行着色器和Stage3d線框?

希望能夠完全解釋我的問題。非常感謝答覆,謝謝!

回答

3

這一切都取決於你的geomtery,而這個問題實際上是在圖頂點着色的問題:你需要你的幾何圖形是3色的。好的起點是the Wikipedia article

舉個例子,我們假設(1, 0, 0)基矢量是紅色的,(0, 1, 0)是綠色的,(0, 0, 1)是藍色的。很明顯,如果您使用以下基本要素

basic graph element

然後建立你的幾何體就可以避免重複頂點,因爲這樣的圖形將是3着色(即每個邊緣,因此每個三角形,都會有不同彩色頂點)。您可以平鋪在任何方向這個基本要素,圖形將保持3 - 着色:

tiling example

+1

謝謝你爲我分手。隨着幾何的變化,我可以做到這一點。 – JimmyDeemo

1

你已經偶然發現了那些讓我對AGAL/Stage3D感到憤怒的事情。在許多情況下,API中的限制會阻止您使用共享頂點。線框渲染就是事情崩潰的一個例子......但簡單的平面着色也是另一個例子。 你需要做的是爲網格中的每個三角形創建三個獨特的頂點。對於每個頂點,添加一個額外的參數(或者設計您的引擎來接受頂點法線並重用這些參數,因爲您不會遮擋線框)。

分別爲每個三角形分配單位向量A [1,0,0],B [0,1,0]或C [0,0,1]。這會讓你開始。請注意,明顯的解決方案(在片段着色器中進行閾值處理並有條件地繪製像素)會產生相當醜陋的別名結果。看看這個頁面的技術的一些見解,以抗混疊的片段程序渲染的線框圖:

http://cgg-journal.com/2008-2/06/index.html

正如我所說,你需要使用類似的技術(每個三角形獨特的頂點),如果你想實施平面着色。由於沒有與GL_FLAT相同的功能,也無法使變化的寄存器返回平均值,所以實現平面着色的唯一方法是針對給定三角形的每個頂點通道計算相同的光照......這意味着每個頂點需要相同的頂點法線。

+0

感謝您的答覆。總而言之,我需要複製頂點並在頂點緩衝區中提供額外的信息?用類似的方法,我提供法線照明時必須要做的事情?感謝您的鏈接重新:別名。 – JimmyDeemo

+1

如果計算頂點法線並執行平滑/ gouraud/phong着色,則不需要複製用於照明的頂點。 當您嘗試實現平面着色時,重心座標與法線貼圖之間的相似性會出現。在這種情況下,您必須複製每個三角形的頂點並將所有三個(每三角形)頂點法線設置爲三角形面法線。爲了解決重心問題,可以將「正常」向量設置爲A [1,0,0],B [0,1,0]和C [0,0,1]。現在,當片段着色器插值時,您將始終能夠找出您在三角形中的位置。 – jordancpaul

+0

我得到你,謝謝你的幫助。 – JimmyDeemo

相關問題