我在#1绘制调用期间在片段着色器中生成了一个缓冲区(作为SSBO访问)。然后,我想使用该缓冲区(作为VBO访问)作为绘图调用#2的输入。
问题是,使用函数void glDrawArrays(GLenum mode, GLint first, GLsizei count),我应该知道countCPU上的值。但是在CPU上,我不知道该值。该值仅作为原子计数器存储在GPU内存中。
有什么方法可以使用count存储在GPU内存中的值作为参数进行绘图调用?
我知道我可以从GPU检索值,然后在CPU中使用它,但是由于同步,这会使程序变慢。
对于此类情况,可以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)