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

时间:2018-09-09 08:51:13

标签: opengl glsl

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

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

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

我正在使用opengl 4.5版,并且不支持扩展名ARB_shader_draw参数。

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

如果没有办法以不同的顺序处理绘图命令,则可以对其重新排序,但如果可能的话,我会避免这种情况。

1 个答案:

答案 0 :(得分: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。因此,除其他事项外,您不能使用索引或其衍生的任何表达式来执行以下操作:

  • 索引到采样器或其他不透明类型的数组中。
  • 索引到接口块的数组中(不是一个块中的 中的数组。一个块本身的数组)