glMultiDraw函数和gl_InstanceID

时间:2018-06-06 14:32:36

标签: opengl glsl

当我查看glMultiDrawElementsIndirect(或Wiki)的文档时,它表示单次调用glMultiDrawElementsIndirect相当于重复调用glDrawElementsIndirect(仅限于不同的参数)。

这是否意味着gl_InstanceID将为这些"内部"中的每一个重置电话?如果是这样,我如何能够在我的顶点着色器中区分所有这些调用?

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

1 个答案:

答案 0 :(得分:2)

文档说"类似于"。 "等效"不是一回事。它还指向glDrawElementsInstancedBaseVertexBaseInstance,而不是glDrawElementsInstanced

但是,无论您提供什么基础实例,任何绘制的gl_InstanceId都将从零开始。不幸的是,这是gl_InstanceId works的结果。

此外,这不是你想回答的问题。您不想询问您要渲染的实例,因为多绘制中的每个绘制都可以渲染多个实例。您正在询问您所在的多抽奖中的抽奖活动。实例ID不会提供帮助。

  

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

除非你有OpenGL 4.6或ARB_shader_draw_parameters,否则你不能。好吧,不是直接的。

也就是说,基于从当前缓冲区对象的不同部分进行渲染而不是基于着色器中的计算,预期多绘制操作会产生不同的结果。您使用从阵列中选择不同顶点的不同基顶点进行渲染,或者您使用不同的索引范围或其他任何顶点。

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

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