OpenGL重叠顶点属性

Posted

技术标签:

【中文标题】OpenGL重叠顶点属性【英文标题】:OpenGL overlapping vertex attributes 【发布时间】:2013-12-23 16:39:16 【问题描述】:

我喜欢在顶点着色器中生成平面着色三角形法线。为此,我需要访问当前顶点着色器中的当前和下一个顶点属性。显然,这可以通过几何着色器来完成,但例如 GL ES 中不存在这些。

那么有没有办法让 GLSL 访问三个连续的顶点位置,但在每次顶点调用中只前进一个位置?否则我将不得不将三个顶点的数据分配给每个顶点.. 一个巨大的开销。

【问题讨论】:

你为什么不预先计算法线/颜色,并将其存储在缓冲区和顶点中? 我不喜欢存储所有可以通过三角形顶点位置轻松获得的法线......即使我存储它们,我也只有三个顶点的一个法线,所以如何访问它们 3 次?同样的问题... 【参考方案1】:

在顶点着色器中无法访问多个顶点。如果要创建平面着色,则需要复制顶点,以便为您需要的每个表面法线提供一个单独的顶点副本(共享该顶点位置的每个面都有一个副本)。这可能是您需要 OpenGL ES 的解决方案。

或者,如果您的目标是 OpenGL 4.x,您可以使用 provoking vertex 的概念,它允许您指定一个顶点,该顶点的属性应该在面的所有顶点上重复使用。受影响的属性仅是在着色器源中与flat 关键字相关联的属性。

【讨论】:

这并没有解决我的主要问题,我根本不喜欢将法线包含在顶点数据中。如果有多个顶点可用,它很容易计算,我想这应该是可能的。但是,似乎需要几何着色器。 如果glVertexAttribPointer 使用了三次,而stride 太小,以及三个不同的偏移量,每个绑定属性都会给出序列中不同的顶点。然而,为了获取按图元分组的数据,需要获取一系列五个顶点,并通过我猜的图元 id 从它们中选择正确的一个。问题是,如果这得到很好的优化,或者创建一个顶点馈送所需的带宽的五倍......当然它不必这样做...... 我认为你误会了。我提出的解决方案是停止尝试优化缓冲区中的顶点数。如果您有一个逻辑顶点出现在 N 个面中,每个面都有不同的表面法线,那么该顶点位置应该出现在您的位置缓冲区中 N 次,而其他缓冲区具有相应的颜色/表面法线/给定的任何内容索引。

以上是关于OpenGL重叠顶点属性的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL顶点属性未启用

OpenGL打包顶点属性

我的OpenGL学习进阶之旅顶点属性顶点数组

我的OpenGL学习进阶之旅顶点属性顶点数组

为啥禁用顶点属性数组零时OpenGL绘图失败?

OpenGL着色器 - 重叠多个纹理