当我查看 glMultiDrawElementsIndirect
的文档时(或在 Wiki 中)它表示对 glMultiDrawElementsIndirect
的一次调用相当于重复调用glDrawElementsIndirect
(只是使用不同的参数)。
这是否意味着 gl_InstanceID
会为这些“内部”调用中的每一个重置吗?如果是这样,我如何在我的顶点着色器中区分所有这些调用?
背景:我试图一次绘制所有不同的网格。但是我需要一些方法来知道我在顶点着色器中处理的顶点属于哪个网格。
最佳答案
文档说“类似于”。 “等价”不是一回事。它还指向 glDrawElementsInstancedBaseVertexBaseInstance
,而不是 glDrawElementsInstanced
.
但是,是的,gl_InstanceId
无论您提供什么基本实例,任何平局都将从零开始。就是这样 gl_InstanceId
works , 很遗憾。
此外,这不是你想要回答的问题。您不会询问您正在渲染哪个实例,因为多重绘图中的每个绘图都可以渲染多个实例。您是在询问您所在的多重抽签中的哪个抽签。实例 ID 无济于事。
And if so, how am I able to tell all these calls apart in my vertex shader?
除非你有 OpenGL 4.6 或 ARB_shader_draw_parameters,否则你不能。好吧,不是直接的。
也就是说,multidraw 操作预计会根据当前缓冲区对象的不同部分的渲染产生不同的结果,而不是基于着色器中的计算。您正在使用从数组中选择不同顶点的不同基本顶点进行渲染,或者您正在使用不同范围的索引或其他。
典型的 pre-shader_draw_parameters 解决方案是在每个单独的绘图上使用唯一的基础实例。当然,因为
gl_InstanceId
不跟踪基本实例(如前所述),您需要使用 instanced arrays instead .所以你会从中得到网格索引。当然,4.6/shader_draw_parameters 给你
gl_DrawId
,它只是告诉你在 multidraw 命令中的索引是什么。它也是动态统一的,因此您可以使用它来访问着色器中的不透明类型数组。
关于opengl - glMultiDraw 函数和 gl_InstanceID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50723025/