一些背景:
我对 OGL 很陌生。我的应用程序只关注 2D。所有物体都垂直于观察方向,我使用正交投影。我发现系统的性能受到 draw* 调用次数的限制,这表明我需要进行更多批处理。
我只需要绘制一个对象,但它由数千个可能重叠的三角形组成。我有能力在我的特定应用程序中预先计算几何形状并将三角形从后到前排序,因为它们具有不同程度的透明度。顶点属性由颜色(仅)组成,包括片段程序中使用的 alpha。
我所做的:
所有图元都是三角形,我为每个三角形的 3 个顶点分配相同的颜色,因为颜色在整个面上是恒定的。我将所有三角形的所有顶点及其颜色放入一个 VBO(16 位;没有那么多顶点)。索引缓冲区将三角形排序回前面,然后我发出一个绘制调用。我使用 alpha 混合(SRC_ALPHA、ONE_MINUS_SRC_ALPHA)。
结果:
我看到结果在我拥有和测试的唯一机器上正确混合和呈现。我没有在其他人身上试过。我已经搜索了很长一段时间,但徒劳无功,寻求一些明确的答案。顺便说一句,唯一的引用是在 VBO 扩展规范中,其中提到了“基元序列”,但它没有解决基元重叠时发生的情况。
题:
这是有保证的行为吗?那结果是否与在立即模式下(由标准保证)在 glBegin(...) 和 glEnd(...) 中发出多次调用相同?
注意:深度缓冲和模板缓冲被关闭。
最佳答案
OpenGL 规范保证图元将按照提供的顺序呈现。从 glDraw*
中提取的每个基元命令将按照其组件顶点指定的顺序呈现。
所以是的:如果您将三角形按顺序排列,这就是渲染它们时将它们取出的顺序。
关于opengl-es - OpenGL ES 和与 VBO 重叠的三角形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10549981/