opengl - glMultiDraw 函数和 gl_InstanceID

标签 opengl glsl

当我查看 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/

相关文章:

c# - 并排显示图像的一半 - OpenGL

Qt & OpenGL : how to render as frequent as possible?

opengl - 有关过剩功能的xcode 5弃用警告

c++ - 灰度与 OpenGL 混合?

glsl - MSAA 和顶点插值导致值超出范围

opengl - 如何使用 opengl 纹理将非标准化/未钳位的值发送到 GLSL 着色器?

c - 在 OpenGL 中渲染每面具有不同纹理的立方体

c++ - OpenGL 纹理无法正确加载

c++ - OpenGL 3.2 纹理问题

glsl - 错误 C7011 : implicit cast from "vec4" to "vec3"