仅使用存储在 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 中使用它,但由于同步,这会减慢程序速度。
对于这种情况,可以结合使用 glDrawArraysIndirect
和 GL_INDIRECT_DRAW_BUFFER
。
您可以使用已经存在的 SSBO 作为间接绘制缓冲区,但您必须确保遵循 DrawArraysIndirectCommand
结构并确保计数存储在 SSBO 的前四个字节中。所有其他数据都可以设置一次,不必通过 SSBO 访问。
typedef struct {
GLuint count;
GLuint instanceCount;
GLuint first;
GLuint baseInstance;
} DrawArraysIndirectCommand;
我在绘制调用 #1 期间在片段着色器中生成缓冲区(作为 SSBO 访问)。 然后我想使用该缓冲区(作为 VBO 访问)作为绘制调用 #2 的输入。
问题是,使用函数 void glDrawArrays(GLenum mode, GLint first, GLsizei count)
,我应该知道 CPU 上的 count
值。但是在 CPU 上我不知道那个值。该值仅作为原子计数器存储在 GPU 内存中。
是否有任何方法可以使用存储在 GPU 内存中的值作为 count
参数进行绘制调用?
我知道我可以从 GPU 中检索值,然后在 CPU 中使用它,但由于同步,这会减慢程序速度。
对于这种情况,可以结合使用 glDrawArraysIndirect
和 GL_INDIRECT_DRAW_BUFFER
。
您可以使用已经存在的 SSBO 作为间接绘制缓冲区,但您必须确保遵循 DrawArraysIndirectCommand
结构并确保计数存储在 SSBO 的前四个字节中。所有其他数据都可以设置一次,不必通过 SSBO 访问。
typedef struct {
GLuint count;
GLuint instanceCount;
GLuint first;
GLuint baseInstance;
} DrawArraysIndirectCommand;