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


8

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

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

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

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

Ответы:


9

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

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

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


Вполне возможно запустить пиксельный шейдер для перекрывающихся треугольников одновременно. Все, что имеет значение, это то, что смешивание происходит последовательно. Пиксельные шейдеры могут выполнять большую часть работы с блоком наложения в любом порядке, который затем может переупорядочивать все эти операции наложения в зависимости от треугольника, из которого он получен.
Джон Калсбек

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

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

@MooseBoys Это именно так, да. Прошло несколько лет с тех пор, как я много сделал с 3D-графикой.
JAB

Помимо простого параллельного запуска нескольких вершин и пикселей, также возможно одновременное выполнение нескольких вызовов отрисовки, если доступно достаточно ресурсов графического процессора и нет зависимости между вызовами отрисовки.
Натан Рид
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.