仅使用存储在 GPU 内存中的 'count' 参数调用 glDrawArray

Call glDrawArray using a 'count' argument stored in GPU memory only

我在绘制调用 #1 期间在片段着色器中生成缓冲区(作为 SSBO 访问)。 然后我想使用该缓冲区(作为 VBO 访问)作为绘制调用 #2 的输入。

问题是,使用函数 void glDrawArrays(GLenum mode, GLint first, GLsizei count),我应该知道 CPU 上的 count 值。但是在 CPU 上我不知道那个值。该值仅作为原子计数器存储在 GPU 内存中。

是否有任何方法可以使用存储在 GPU 内存中的值作为 count 参数进行绘制调用?

我知道我可以从 GPU 中检索值,然后在 CPU 中使用它,但由于同步,这会减慢程序速度。

对于这种情况,可以结合使用 glDrawArraysIndirectGL_INDIRECT_DRAW_BUFFER

您可以使用已经存在的 SSBO 作为间接绘制缓冲区,但您必须确保遵循 DrawArraysIndirectCommand 结构并确保计数存储在 SSBO 的前四个字节中。所有其他数据都可以设置一次,不必通过 SSBO 访问。

typedef  struct {
   GLuint  count;
   GLuint  instanceCount;
   GLuint  first;
   GLuint  baseInstance;
} DrawArraysIndirectCommand;