glMultiDraw functions and gl_InstanceID

mic*_*mic 5 opengl glsl

When I look at the documentation of glMultiDrawElementsIndirect (or in the Wiki) it says that a single call to glMultiDrawElementsIndirect is equivalent to repeatedly calling glDrawElementsIndirect (just with different parameters).

Does that mean that gl_InstanceID will reset for each of these "internal" calls? And if so, how am I able to tell all these calls apart in my vertex shader?

背景:我试图一次绘制所有不同的网格。但是我需要一些方法来知道我在顶点着色器中处理的顶点属于哪个网格。

Nic*_*las 2

该文档说“类似于”。“同等”不是同一件事。这也指向glDrawElementsInstancedBaseVertexBaseInstance,不是glDrawElementsInstanced

但是,是的,gl_InstanceId无论您提供什么基本实例,任何抽奖都将从零开始。不幸的是,这就是gl_InstanceId工作原理。

此外,这不是你想要回答的问题。您不想询问正在渲染哪个实例,因为多次绘制中的每次绘制都可以渲染多个实例。您询问您所在的多重抽奖中的哪一个抽奖。实例 ID 没有帮助。

如果是这样,我如何在顶点着色器中区分所有这些调用?

除非您有 OpenGL 4.6 或 ARB_shader_draw_parameters,否则不能。嗯,不直接。

也就是说,多重绘制操作预计会根据当前缓冲区对象不同部分的渲染产生不同的结果,而不是基于着色器中的计算。您正在使用不同的基本顶点进行渲染,该基本顶点从数组中选择不同的顶点,或者您正在使用不同范围的索引或其他什么。

典型的 pre-shader_draw_parameters 解决方案是在每个单独的绘制上使用唯一的基础实例。当然,由于gl_InstanceId不跟踪基本实例(如前所述),因此您需要使用实例化数组。所以你可以从中得到网格索引。

当然,4.6/shader_draw_parameters 为您提供了gl_DrawId,它只是告诉您 multidraw 命令中的索引是什么。它也是动态统一的,因此您可以使用它来访问着色器中不透明类型的数组。