Выполняются ли вызовы отрисовки параллельно, последовательно или одновременно?

8

Это продолжение вопроса, на который я ответил на GameDev SE. Вопрос заключался в том, является ли glDrawArraysInstanced в OpenGL параллельным при рисовании этих экземпляров?

Мой ответ был в следующих строках: «Графический процессор может выполнять несколько вызовов отрисовки параллельно в зависимости от нескольких вещей, например, если два вызова отрисовки используют одни и те же вершинные шейдеры». Вот полный ответ .

В комментариях ОП упоминается: «Я думаю, что это должно быть последовательным. В конце концов, некоторые режимы смешивания зависят от последовательности»

Теперь я немного смущен. Будет ли мой ответ на них все еще распараллеливать их, когда он сможет быть действительным? Может кто-нибудь уточнить это?

concept3d
источник

Ответы:

9

Результат должен быть таким, как если бы он выполнялся последовательно по одному треугольнику за раз. Это важно, чтобы каждый кадр был детерминированным. Если это не так, то рисование одного и того же кадра несколько раз может привести к разным результатам и создать мерцающее изображение на экране.

Однако это не означает, что распараллеливание невозможно . Вершины могут быть вычислены параллельно. Их результаты будут упорядочены и переданы в растеризатор, который будет обрабатывать этап фрагментного шейдера.

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

чокнутый урод
источник
Вполне возможно запустить пиксельный шейдер для перекрывающихся треугольников одновременно. Все, что имеет значение, это то, что смешивание происходит последовательно. Пиксельные шейдеры могут выполнять большую часть работы с блоком наложения в любом порядке, который затем может переупорядочивать все эти операции наложения в зависимости от треугольника, из которого он получен.
Джон Калсбек
Я видел ситуации, когда мерцание происходит из-за нескольких треугольников, лежащих в одной плоскости, но я не помню, происходило ли это в то время, когда камера / мир / и т.д. преобразования были статическими или, если это требовало перемещения и пересчета. Это крайний случай, хотя.
JAB
@JAB Похоже, ты имеешь в виду z-бой . Это обычно происходит из-за того факта, что даже если два примитива аналитически копланарны, квантование в интерполяторе создает схему, в которой видны некоторые пиксели из обоих примитивов. Шаблон будет смещаться, вызывая мерцание, только если вершины (или камера) перемещаются, в противном случае интерференционная картина должна быть согласованной между кадрами.
MooseBoys
@MooseBoys Это именно так, да. Прошло несколько лет с тех пор, как я много сделал с 3D-графикой.
JAB
Помимо простого параллельного запуска нескольких вершин и пикселей, также возможно одновременное выполнение нескольких вызовов отрисовки, если доступно достаточно ресурсов графического процессора и нет зависимости между вызовами отрисовки.
Натан Рид