Чтобы понять, что это за функция, вы должны понять, как все работало раньше.
До 4.0 OpenCL мог заполнять объекты буфера OpenGL данными. Действительно, обычные команды OpenGL могут заполнять буферные объекты OpenGL данными, либо с обратной связью преобразования, либо путем рендеринга в текстуру буфера< /а>. Эти данные могут быть данными вершин, которые будут использоваться для рендеринга.
Только ЦП может инициировать визуализацию данных вершин (путем вызова одной из glDraw*
функций. Тем не менее, здесь нет необходимости в явной синхронизации (за исключением того, что требуется для взаимодействия OpenCL/OpenGL).В частности, центральному процессору не нужно читать данные, записанные операциями графического процессора.
Но это приводит к проблеме. Если OpenCL, или любая другая операция GPU, всегда записывает в буфер известное количество вершин, то все в порядке. Однако это не обязательно. Процессу GPU часто желательно записывать произвольное количество вершин. Очевидно, должен быть максимальный предел (размер буфера). Но помимо этого, вы хотите, чтобы он мог писать все, что захочет.
Проблема в том, что OpenCL сам решил, сколько писать. Но ЦП теперь нуждается в этом числе, чтобы использовать одну из glDraw
функций. Если OpenCL записал 22 000 вершин, то процессору нужно передать 22 000 в glDrawArrays
.
Что делает ARB_draw_indirect (основная функция GL 4.0), так это позволяет GPU процесс для записи значений в буферный объект, которые представляют параметры, которые вы передали бы функции glDraw*
. Единственный параметр, не охваченный этим, — это примитивный тип.
Обратите внимание, что ЦП по-прежнему контролирует, когда происходит рендеринг. ЦП по-прежнему решает, из каких буферов извлекать данные вершин. Таким образом, OpenCL может написать несколько из этих glDraw*
команд, но до тех пор, пока процессор не вызовет glDrawElementsIndirect
для одной из них на самом деле ничего не отображается.
Итак, что вы можете сделать, так это запустить процесс OpenCL, который запишет некоторые данные в существующие буферные объекты. Затем вы привязываете эти буферы, используя обычную настройку вершин, как с VAO. Процесс OpenCL запишет соответствующие данные команды рендеринга в другие объекты буфера, которые вы привяжете как непрямые буферы. А затем вы используете glDraw*Indirect
для рендеринга этих команд.
ЦП никогда не должен считывать данные с графического процессора.
person
Nicol Bolas
schedule
17.03.2012