这就是我想要做的:我想使用实例渲染一个由多个对象(四边形)组成的 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/