使用multiDrawArraysIndirect时如何获得正确的ssbo数组索引?

问题描述 投票:1回答:1

在我的着色器中,我有一个包含结构数组的ssbo。

layout(std430, binding = 14) readonly buffer Block {
    Uniform uniform[];
};

现在我想使用glDrawArraysIndirect,我需要使用每个draw命令传递ssbo的索引。

我使用的是opengl 4.5版,不支持扩展ARB_shader_draw参数。

另外一个问题是我使用的是三重缓冲区,因此我需要将偏移量的当前部分的偏移量添加到索引中,并且绘制命令的顺序不一定与缓冲区中的结构相同。

如果无法以不同的顺序绕过绘图命令,我可以重新排序它们,但如果可能的话,我会避免这种情况。

opengl glsl
1个回答
1
投票

如果有一种简单的方法可以绕过ARB_shader_draw_parameters的功能......那么功能就不需要存在了。

与ARB_shader_draw_parameters最接近的是使用draw indirect命令中的基本实例索引。您生成的每个绘图都会为自己分配一个基本实例,该索引表示用于索引数组的索引。

当然,ARB_shader_draw_parameters还提供对gl_BaseInstanceARB值的访问,该值是draw命令的基本实例字段。它提供了这个,因为gl_InstanceID不受基本实例的影响。只有从vertex shader instanced arrays获取的值受基本实例的影响。

因此,为了使用基本实例,您必须拥有一个实例数组,它只是一系列线性递增的整数。该值将是您需要的基本实例索引。

由于你无法使用gl_DrawIDARB,因此不能保证dynamically uniform这样的基本实例值。因此,您不能使用索引或从中派生的任何表达式来执行以下操作:

  • 索引到采样器或其他不透明类型的数组。
  • 索引到接口块数组(不是块中的数组。块数组本身)
© www.soinside.com 2019 - 2024. All rights reserved.