我有接受以下屬性的頂點着色器:OpenGL:多個頂點的單頂點屬性?
a_posCoord
:頂點位置a_texCoord
:紋理座標(傳遞到片段着色器)a_alpha
:透明度因子(傳遞到片段着色器)
我渲染的對象都是「廣告牌」(一對用於製作矩形的直角三角形)。
我使用一個電話glDrawArrays
來渲染許多廣告牌,每個廣告牌可能具有唯一的alpha值。一個廣告牌有6個頂點。下面是一些僞代碼來說明我如何組織頂點屬性緩衝區單個廣告牌:
vertexAttributes = [
px1,py1,pz1, // vertex 1: a_posCoord
tx1,ty1, // vertex 1: a_texCoord
alpha, // vertex 1: a_alpha
px2,py2,pz2, // vertex 2: a_posCoord
tx2,ty2, // vertex 2: a_texCoord
alpha, // vertex 2: a_alpha
px3,py3,pz3, // vertex 3: a_posCoord
tx3,ty3, // vertex 3: a_texCoord
alpha, // vertex 3: a_alpha
px4,py4,pz4, // vertex 4: a_posCoord
tx4,ty4, // vertex 4: a_texCoord
alpha, // vertex 4: a_alpha
px5,py5,pz5, // vertex 5: a_posCoord
tx5,ty5, // vertex 5: a_texCoord
alpha, // vertex 5: a_alpha
px6,py6,pz6, // vertex 6: a_posCoord
tx6,ty6, // vertex 6: a_texCoord
alpha // vertex 6: a_alpha
// ... Many more billboards not shown ...
];
注意到同樣的alpha
值是如何重複6次,每次一個頂點。
有沒有一種方法可以爲所有6個頂點指定一個屬性,而無需爲每個頂點重複該屬性?
這是我希望我的頂點屬性緩衝區的樣子,在減少緩衝區的大小的興趣是什麼:
vertexAttributes = [
px1,py1,pz1, // vertex 1: a_posCoord
tx1,ty1, // vertex 1: a_texCoord
px2,py2,pz2, // vertex 2: a_posCoord
tx2,ty2, // vertex 2: a_texCoord
px3,py3,pz3, // vertex 3: a_posCoord
tx3,ty3, // vertex 3: a_texCoord
px4,py4,pz4, // vertex 4: a_posCoord
tx4,ty4, // vertex 4: a_texCoord
px5,py5,pz5, // vertex 5: a_posCoord
tx5,ty5, // vertex 5: a_texCoord
px6,py6,pz6, // vertex 6: a_posCoord
tx6,ty6, // vertex 6: a_texCoord
alpha // vertex 1-6: a_alpha
// ... Many more billboards not shown ...
];
對於它的價值,我目前的解決方案工作得很好,但讓我感覺髒。我剛剛開始處理使用glVertexAttribPointer
,並想知道它是否支持這樣的事情,或者如果有一種不同的方法或技術我可以用來實現更少的暴力行爲。
這是更具體的是WebGL的問題,但我很好奇的OpenGL一般意義上的。
我知道一個幾何着色器真的是我需要的這個特定的例子,但它是沒有問題的,因爲它們目前在WebGL中不受支持。
[渲染與多個索引網]的可能重複(http://stackoverflow.com/questions/11148567/rendering-meshes-with-multiple-indices) –
非常接近被確實是一個副本,但我想保留它幾天,看看有沒有其他的知識,因爲我的問題是更具體一些,有人可能有一個完全不同的方法,我不知道。我猜我必須堅持使用冗餘數據,直到WebGL利用ES3的幾何着色器支持。 – namuol
我注意到glVertexBindingDivisor不是WebGL 1.0或ES 2.0(我正在使用)的一部分...... :( – Andy