несколько теневых карт в отложенном затенении - PullRequest
0 голосов
/ 15 мая 2018

У меня есть вопрос об использовании нескольких теневых карт в отложенном затенении. Я реализовал одну карту теней в затенении вперед. При прямом рендеринге в вершинном шейдере каждого объекта я вычислял его положение в световом пространстве и сравнивал его с картой теней в фрагментном шейдере. Я вижу, что работа с несколькими картами с массивом матриц проекций и массивом теневых карт в форме.

В случае отложенного затенения мне было интересно, что является обычной практикой. На мой взгляд, есть несколько вариантов:

  1. В отложенном затенении для каждого пикселя я рассчитываю его положение в каждом световом пространстве и сравниваю его с соответствующей картой освещения. (таким образом я делаю вычисления для каждого фрагмента и каждой матрицы, которые могут быть слишком дорогими?)

  2. При прямом рендеринге я вычисляю положение каждой вершины в каждой проекции, и для каждой позиции есть выход G-буфера. Затем я делаю сравнение в отложенном затенении. (таким образом, я делаю вычисление положения только один раз для каждой вершины, а не один раз для каждого пикселя, но у меня есть карта теней и позиция светового пространства для каждой тени, которая кажется неоптимальной)

  3. Немного похоже на 2. Но я делаю проверку в прямом рендеринге. Таким образом, я могу хранить много логических значений, если они находятся на свету или нет для каждой тени в одной внутренней текстуре. Проблема в том, что я не могу делать мягкие тени таким образом.

  4. Может быть, что-то лучше?

Для синтеза: 1 требует много умножения матриц, но его легко реализовать. 2 требует немного умножения матриц, но много текстур и выводов (что ограничено графической картой). и 3 требует немного вывода и несколько вычислений на пиксель. Но я не могу получить мягкие тени, потому что результатом является массив логических значений.

Я не делаю это на самом деле для лучшей производительности, но в основном для изучения новых вещей. Я открыт для предложений. Может быть, я что-то неправильно понимаю. Есть ли стандартный способ сделать это?

...