Отложенный рендеринг с концепцией выборки на основе листов
РЕДАКТИРОВАТЬ: Я все еще ищу некоторую помощь по использованию OpenCL или вычислительных шейдеров. Я бы предпочел продолжать использовать OGL 3.3 и не иметь дело с плохой поддержкой драйверов для OGL 4.3 и OpenCL 1.2, но я никак не могу придумать, чтобы сделать этот тип затенения без использования одного из двух (для соответствия индикаторам и плитка). Возможно ли реализовать отсечение на основе плиток без использования GPGPU?
Я написал отложенный рендер в OpenGL 3.3. Прямо сейчас я не делаю отбраковку для прохода света (я просто отображаю четырехэкранный квад для каждого источника света). Это (очевидно) имеет массу оверрейдов. (Иногда это ~100%). Из-за этого я искал способы улучшить производительность во время прохождения света. Похоже, что лучший способ (почти), по мнению каждого, состоит в том, чтобы отбирать сцену с использованием тайлов на экране. Этот метод использовался в Frostbite 2. Я прочитал презентацию Эндрю Лауритцена во время SIGGRAPH 2010 ( http://download-software.intel.com/sites/default/files/m/d/4/1/d/8/lauritzen_deferred_shading_siggraph_2010.pdf), и я не уверен, что полностью понимаю эту концепцию. (и в этом отношении, почему это лучше чем что-либо еще, и если это лучше для меня)
В презентации Laurtizen рассматривает отложенное затенение с легкими объемами, квадратами и плитками для отбраковки сцены. По его данным, отложенный рендерер на основе тайлов был самым быстрым (на сегодняшний день). Я не понимаю, почему это так. Я предполагаю, что это как-то связано с тем фактом, что для каждой плитки все источники света объединены. В презентации говорится, что нужно один раз прочитать G-Buffer, а затем вычислить освещение, но для меня это не имеет смысла. На мой взгляд, я бы реализовать это так:
for each tile {
for each light effecting the tile {
render quad (the tile) and compute lighting
blend with previous tiles (GL_ONE, GL_ONE)
}
}
Это все еще будет включать в себя выборку G-Buffer. Я думаю, что выполнение этого будет иметь такую же (если не худшую) производительность, как рендеринг экрана с выравниванием квадратора для каждого источника света. Судя по тому, как это сформулировано, кажется, что вот что происходит:
for each tile {
render quad (the tile) and compute all lights
}
Но я не понимаю, как можно было бы сделать это без превышения предела команд для фрагментного шейдера на некоторых графических процессорах. Кто-нибудь может мне с этим помочь? Кажется также, что почти каждый отложенный рендерер на основе плиток использует вычислительные шейдеры или OpenCL (для пакетного освещения), почему, и если бы я не использовал их, что бы произошло?
1 ответ
Но я не понимаю, как можно было бы сделать это без превышения предела команд для фрагментного шейдера на некоторых графических процессорах.
Это скорее зависит от того, сколько у вас света. "Пределы инструкций" довольно высоки; Обычно это не то, о чем вам нужно беспокоиться за пределами вырожденных случаев. Даже если более 100 источников света влияют на плитку, вероятность того, что ваши расчеты освещения не превысят пределы инструкций, достаточно высока.
Современное оборудование GL 3.3 может выполнять не менее 65536 динамических команд в фрагментном шейдере и, вероятно, больше. Для 100 источников света это все равно 655 инструкций на источник света. Даже если вы берете 2000 инструкций для вычисления положения камеры, это все равно оставляет 635 инструкций на свет. Даже если вы делали Cook-Torrance непосредственно в GPU, этого, вероятно, все еще достаточно.