2012-02-02 52 views

回答

6

沒有直接的方式來訪問片段着色器中的頂點,頂點着色器一次只處理1個頂點,並且沒有整個基元的概念。片段着色器僅處理片段。

您可以輸出關於特定頂點的信息,並將其插入片段着色器,例如如何在三角形上混合顏色或執行紋理座標。通常情況下,無論如何,您都需要在片段着色器中進行混合處理,以便在頂點着色器中自動完成。你可以得到碎片三維空間座標(但只有碎片,而不是周圍的頂點)。

這樣說,你可以附加任何信息到你的着色器。例如,除了位置,法線和texcoords之外,還可以有一個額外的屬性,其中包含有關要在特定頂點中訪問的每個頂點的信息。如果這可能是3組x,y,z座標,如果這是你想要的信息和一個數字,表示正在處理的圖元中的哪個頂點數(即三角形中的第一個第二或第三個頂點)和/或序列號在整個網格中。或者它可能只是一個索引號,如果這是你想要的。額外的屬性會佔用更多的內存,因爲您必須複製基元中每個頂點的頂點數據,以確保片段着色器與其所有3個頂點具有相同的數據。

例如,對於每個頂點(對於三角形圖元)以下屬性:

v1, n1, uv1, v1, v2, v3, 0 
v2, n2, uv2, v1, v2, v3, 1 
v3, n3, uv3, v1, v2, v3, 2 
v4, n4, uv4, v4, v5, v6, 0 
v5, n5, uv5, v4, v5, v6, 1 
v6, n6, uv6, v4, v5, v6, 2 

如果你需要,你需要重複,太多的法線或紋理COORDS。

還要考慮片段着色器中的頂點信息實際上在做什麼。您可以預先計算在片段着色器中要計算的答案,而不是將所有頂點的數據發送出去,而是將答案附加爲屬性,並從頂點着色器到片段着色器進行插值。

另一種方法是將所有頂點數據轉儲到統一數據庫中並查找它。你可能仍然需要附加一些索引信息作爲頂點屬性,儘管它知道它應該查找哪個索引。另外請記住,由於每個像素都會發生查找,因此查找速度會很慢,並且您可能會發生碰撞,因爲每個頂點都將查看有關周圍信息的信息。

在較新版本的OpenGL(3.x +)幾何圖形和細化着色器中,可以訪問這種信息並將其輸出到着色器管道中的下一個東西。

有了這樣的說法,它將有助於準確地知道你要完成什麼,因爲它提供了哪些頂點數據需要傳遞給片段着色器。如果沒有訪問片段着色器中的數據,也可能有更簡單的方法來做你想做的事情。

2

片段着色器確實沒有鏈接到頂點着色器,而頂點着色器是每個頂點,沒有創建該幾何圖形的總集合的概念。所以你不能獲得最終產生片段着色器實例的頂點。

您試圖實現特定效果嗎?無論你想從頂點計算出來,通常都可以通過加載適當的變化來實現 - 例如,如果您將每個頂點的3d位置加載到適當的變化,那麼每個片段將固有地知道其位置。

相關問題