我有一个接受以下属性的顶点着色器:
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 中不受支持。