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

Tar*_*ani 2 opengl opengl-4

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

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

有什么方法可以使用count存储在GPU内存中的值作为参数进行绘图调用?

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

BDL*_*BDL 6

对于此类情况,可以glDrawArraysIndirect结合GL_INDIRECT_DRAW_BUFFER使用。

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

typedef  struct {
   GLuint  count;
   GLuint  instanceCount;
   GLuint  first;
   GLuint  baseInstance;
} DrawArraysIndirectCommand;
Run Code Online (Sandbox Code Playgroud)