2011-12-01 304 views
2

我有一大組頂點,目前使用glColorPointer指定它們的顏色。問題是,glColorPointer只接受3或4的大小作爲其第一個參數,但每個頂點的R,G和B的值是相同的。用頂點屬性代替顏色

當然,我可以使用glVertexAttribPointer指定每個顏色值作爲大小爲1的屬性,並在着色器中複製它,但我正在尋找一種方法在固定功能管道中執行此操作。 調用glColor1*是不幸的問題給定的頂點的數量(是的,我試過了)。

任何將價值擠入其他東西的創造性解決方案也是可以的。

回答

3

我想如果沒有着色器,這將是不可能的,因爲,很好,glColorPointer只接受大小爲3或4,像你已經發現了(也應該有不glColor1,只有glColor3glColor4)。

您可以通過指定大小3而不是1(ubyte)或4(float)的步幅來欺騙glColorPointer以使用緊密排列的數組。但是,這會給你一個(Ri, Ri+1, Ri+2)的頂點i的顏色,並且無法將其調整爲(Ri, Ri, Ri),因爲顏色矩陣並不適用於每個頂點的顏色,而只適用於像素圖像。

所以沒有着色器,你沒有太多的創造力了。你可以做的是使用尺寸爲256的一維紋理,其中包含從(0,0,0)到(255,255,255)的所有灰色依次。然後,您可以將每個頂點顏色作爲1D紋理座標使用到該紋理中。但我不確定這是否真的會在空間或時間上爲您購買任何東西。

簡單而直接的方法是使用頂點屬性和着色器來實現將屬性解包爲片段顏色。這隻需要幾行着色器代碼,應該是首選解決方案。這裏真正的困難是人爲限制,而不是問題空間本身。這種情況應該通過解除限制來解決。

+1

感謝您的建議。最後,我只是在那裏砍了一個const char *着色器,然後用每個頂點的一個float屬性去映射成一個顏色。人爲地限制自己首先是錯誤的。 – pmr

+0

@pmr既然你明確地說過你知道如何用着色器做,但不想,我沒有詳細說明這個話題。它可能只是這個限制不是人爲的,而是真實的(舊硬件或其他)。由於該問題明確要求提供無着色解決方案,因此也可以在未經編輯的情況下接受答案,但無論如何都要接受。無論如何編輯反映了我的想法。 –

+0

爲了讓程序變得「簡單」,我制定了這個約束條件。這個假設是錯誤的,因此我最終稱人爲約束。真正的答案是實現這一點,你的文章幫助我看到了這一點。因此,這是應該被接受的答案。這是薈萃星期天在這裏。 – pmr

0

您可以將顏色信息存儲在1D紋理中(只有一個通道),然後您可以使用基於gl_vertexID讀取適當顏色的頂點着色器。

+0

對不起,沒有着色器。正如問題中提到的那樣。我知道限制是愚蠢的。不要問。 – pmr