当我查看glMultiDrawElementsIndirect (或在维基中)的文档时,它说对glMultiDrawElementsIndirect的单个调用等同于重复调用glDrawElementsIndirect (只是具有不同的参数)。
这是否意味着gl_InstanceID将对每个“内部”调用进行重置?如果是这样的话,我怎么能在我的顶点阴影中区分所有这些调用呢?
背景:我正试着一次画出所有不同的网格。但我需要一些方法来知道哪个网格的顶点,我正在处理我的顶点着色,属于。
发布于 2018-06-06 14:46:45
文件上写着“类似于”。“对等”不是一回事。它还指向glDrawElementsInstancedBaseVertexBaseInstance,而不是glDrawElementsInstanced。
但是是的,无论您提供什么基本实例,任何抽签的gl_InstanceId都将从零开始。不幸的是,作品就是这么做的。
而且,这不是你想要回答的问题。您并不想问您正在呈现的是哪个实例,因为多绘图中的每一次绘制都可以呈现多个实例。你在问你在多个平局中是哪一个抽签。实例ID不会有帮助。
如果是这样的话,我怎么能在我的顶点阴影中区分所有这些调用呢?
除非你有OpenGL 4.6或ARB_shader_draw_parameters,否则你不能。嗯,不是直接的。
也就是说,多绘图操作将根据当前缓冲区对象的不同部分的呈现而产生不同的结果,而不是基于着色器中的计算。您使用的是不同的基顶点,这些顶点从数组中选择不同的顶点,或者使用不同范围的索引或其他什么。
典型的预着色绘制参数解决方案将是在每个单独的绘图上使用一个唯一的基本实例。当然,由于gl_InstanceId不跟踪基本实例(如前所述),因此需要使用实例数组。这样你就可以得到网格索引了。
当然,4.6/着色器_draw_ gl_DrawId给出了,它只是告诉您多重绘制命令中的索引是什么。它也是动态统一的,所以您可以使用它访问阴影中的不透明类型数组。
https://stackoverflow.com/questions/50723025
复制相似问题