opengl - 使用 OpenGL 实例化通过对象深度和 Alpha 混合渲染 2D 场景

标签 opengl

这就是我想要做的:我想使用实例渲染一个由多个对象(四边形)组成的 2D 场景。 y 值较低的对象(朝向屏幕底部)需要渲染在 y 值较高的对象前面。并且 Alpha 混合也需要发挥作用。

所以我的第一个想法是使用 Z 值作为深度,但我很快意识到除非以正确的顺序绘制对象,否则 alpha 混合将不起作用。但我不会对每个四边形发出一次调用,而是使用单个实例调用来渲染整个场景。将实例数据按正确的排序顺序似乎对我有用,但我怀疑这是我可以依赖的东西,因为 GPU 应该尽可能并行地运行这些计算。

所以问题是,有没有办法让这个工作成功?我现在能想到的最好的事情就是为每个单独的 y 值发出实例调用(并按从后到前的顺序发出这些调用)。有更好的方法吗?

最佳答案

实例化最适合每个实例都是中等大小的情况:数百甚至数千个三角形。四边形不适合实例化。

只需构建并渲染一系列三角形。甚至有办法efficiently get around the lack of a GL_QUADS primitive type在现代 OpenGL 中。

Putting the instance data in the correct sorted order seems to work for me, but I doubt this is something I can rely on, since the GPU is supposed to run those computations in parallel as much as possible.

GPU 不是这样工作的。

当您发出渲染命令时,您(最终)得到的是一系列基元。由于提供给该命令的顶点是有序的(从第一个到最后一个),并且该命令中的实例也是有序的,甚至单个绘制命令中的绘制也是有序的,因此可以为绘制调用中的每个基元分配一个顺序相对于基于顶点、实例和绘制顺序的所有其他图元。

这定义了 primitive order for a drawing command 。 GPU 保证混合(以及逻辑操作和其他可见的 post-fragment shader operations )将尊重渲染命令以及渲染命令之间的原始顺序。也就是说,如果您在一次调用中绘制 2 个三角形,并且第一个三角形位于第二个三角形后面(深度测试关闭),则第二个三角形的混合将遵循第一个三角形写入的数据。

基本上,如果您按顺序向 GPU 提供基元,GPU 将在混合等方面尊重该顺序。

同样,只需构建一个有序的三角形流来表示您的四边形并渲染它们。

关于opengl - 使用 OpenGL 实例化通过对象深度和 Alpha 混合渲染 2D 场景,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62537968/

相关文章:

c++ - OpenGL 3.3 光照产生了非常奇怪的变形

opengl - 无限魔方世界引擎(如Minecraft)优化建议?

c++ - 在 OpenGL 引擎中组织 GLSL 着色器

c++ - 使用 GL_TRIANGLES 的 OpenGL 奇怪渲染

c++ - OpenGL:如何根据相机距离对点进行排序?

c++ - 如何将多个纹理应用于立方体的 VBO?

c++ - EGL 在第一次 opengl 函数调用时崩溃

c - 如何阻止 gl 在几 (7) 帧后挂起?

c++ - gwen + opengl 什么都看不到

c++ - 曲面 segmentation 着色器没有输出?