2012-02-22 13 views
4

我想知道是否有方法來判斷頂點着色器中是否啓用了頂點屬性?我知道,如果頂點屬性被禁用,所有的值將0.0對待,所以我可以做類似如下的測試:您能否告訴您是否在頂點着色器中啓用了頂點屬性?

if (attribute == 0) 
{ 
    // Do something different to normal. 
} 
else 
{ 
    // Use the attribute. 
} 

但是,這爲案件的明顯的問題,屬性已啓用,該值只是設置爲0(它將被視爲被禁用)!

另一種解決方案是隻使用一個統一的變量來說明是否使用該屬性,但我想知道是否有內置於GLSL的內容會這樣做?

回答

5

不,沒有。

自己傳遞一個布爾值統一來模擬它。

+0

謝謝!這就是我一起去的。如果這可能成爲未來的GLSL功能將會很好! – 2012-02-22 21:44:51

13

FYI:

我知道,如果頂點屬性被禁用,所有的值將0.0對待,所以我可以做類似如下的測試:

這是不正確。如果一個屬性被禁用,它的值來自常規的OpenGL狀態。即,由glVertexAttrib功能設置的狀態。因此,將這些「常量屬性」發送給着色器是完全合法的。

這就是爲什麼API沒有讓着色器判斷屬性是否「禁用」的方法。 「禁用」屬性可能仍然有有意義的數據。

+0

@OP因此,檢查特定「未啓用」值的解決方案可以調整爲使用不同於0的值,而不是可能出現的「真實」屬性值,只需設置「glVertexAttrib」到這個值。所以你不需要額外的布爾值。 – 2012-02-22 22:23:54

+0

哦! 'glVertexAttrib'函數是否設置了將用於每個頂點的值?例如,如果我調用'glVertexAttrib1f(3,-1.0f)',那麼位置3的所有頂點屬性都將設置爲-1.0f? – 2012-02-23 01:50:09

+0

@JamesBedford:是的。除非啓用了該屬性的數組。 – 2012-02-23 01:51:54