【发布时间】:2018-06-02 06:35:23
【问题描述】:
我有一个接受以下属性的顶点着色器:
-
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 中不受支持。
【问题讨论】:
-
确实非常接近重复,但我想保持开放几天看看是否还有其他知识,因为我的问题更具体一些,有人可能有一种我不知道的完全不同的方法。我猜在 WebGL 使用 ES3 的几何着色器支持之前,我将不得不坚持使用冗余数据。
-
我注意到 glVertexBindingDivisor 不是 WebGL 1.0 或 ES 2.0(我正在使用)的一部分... :(
标签: opengl-es webgl shader vertex