Вызовите glDrawArray, используя аргумент count, хранящийся только в памяти GPU - PullRequest
2 голосов
/ 10 марта 2019

Я генерирую буфер (доступный как SSBO) в фрагментном шейдере во время вызова отрисовки # 1.Затем я хотел бы использовать этот буфер (доступный как VBO) в качестве входных данных для вызова отрисовки # 2.

Проблема в том, что, используя функцию void glDrawArrays(GLenum mode, GLint first, GLsizei count), я должен знать значение countна процессоре.Но на процессоре я не знаю это значение.Это значение сохраняется только в памяти графического процессора в качестве хранилища атомарного счетчика.

Можно ли сделать вызов отрисовки, используя в качестве аргумента count значение, хранящееся в памяти графического процессора?

Я знаю, что могу получить значение из графического процессора и затем использовать его в ЦП, но это приведет к замедлению работы программы из-за синхронизации.

1 Ответ

6 голосов
/ 10 марта 2019

Для таких сценариев можно использовать glDrawArraysIndirect в сочетании с GL_INDIRECT_DRAW_BUFFER.

Вы можете использовать уже существующий SSBO в качестве буфера косвенного рисования, но вы должны убедиться, что следуете структуре DrawArraysIndirectCommand и убедитесь, что счет сохраняется в первых четырех байтах SSBO. Все остальные данные могут быть установлены один раз и не должны быть доступны через SSBO.

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