在我的着色器中,我有一个包含结构数组的ssbo。
layout(std430, binding = 14) readonly buffer Block {
Uniform uniform[];
};
现在我想使用glDrawArraysIndirect,我需要使用每个draw命令传递ssbo的索引。
我使用的是opengl 4.5版,不支持扩展ARB_shader_draw参数。
另外一个问题是我使用的是三重缓冲区,因此我需要将偏移量的当前部分的偏移量添加到索引中,并且绘制命令的顺序不一定与缓冲区中的结构相同。
如果无法以不同的顺序绕过绘图命令,我可以重新排序它们,但如果可能的话,我会避免这种情况。
如果有一种简单的方法可以绕过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这样的基本实例值。因此,您不能使用索引或从中派生的任何表达式来执行以下操作: