当我查看glMultiDrawElementsIndirect
(或Wiki)的文档时,它表示单次调用glMultiDrawElementsIndirect
相当于重复调用glDrawElementsIndirect
(只是使用不同的参数)。
这是否意味着gl_InstanceID
将为这些“内部”呼叫重置?如果是这样,我怎么能在我的顶点着色器中区分所有这些调用呢?
背景:我正在尝试同时绘制所有不同的网格。但我需要一些方法来知道我在顶点着色器中处理的顶点属于哪个网格。
文档说“类似于”。 “等价”不是一回事。它也指向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命令中的索引是什么。它也是动态统一的,因此您可以使用它来访问着色器中的不透明类型的数组。