我在绘制调用#1期间在片段着色器中生成缓冲区(作为SSBO访问)。然后我想使用该缓冲区(作为VBO访问)作为绘制调用#2的输入。
问题是,使用函数void glDrawArrays(GLenum mode, GLint first, GLsizei count)
,我应该知道CPU上的count
值。但在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;