Расчет света (затенение) в модели, касательной или пространстве камеры?

В настоящее время я пытаюсь реализовать рельефное отображение, для которого требуется «касательное пространство». Я прочитал несколько руководств, в частности следующие два:

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

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

Мои вопросы по этой теме:

  • Для расчета затенения в касательном пространстве, что именно я должен передать между вершинным и фрагментным шейдерами? Мне действительно нужно преобразовывать положения источников света в касательном пространстве, требуя O(number of lights) переменных переменных? Это, например, не будет работать для отложенного затенения или если положения источников света неизвестны по какой-либо другой причине в вершинном шейдере. Должна быть (все еще эффективная) альтернатива, которая, как я полагаю, представляет собой вычисление затенения в пространстве модели.

  • Если я передам варианты пространства модели, будет ли хорошей идеей выполнять вычисления затенения в касательном пространстве, т.е. преобразовывать положения источников света во фрагментном шейдере? Или лучше выполнять вычисления затенения в пространстве модели? Что будет быстрее? (В обоих случаях мне нужна матрица TBN, но в одном случае требуется преобразование модели в касательную, а в другом — преобразование касательной в модель.)

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


person leemes    schedule 10.10.2013    source источник


Ответы (1)


Отображение нормалей обычно делается в касательном пространстве, потому что карты нормалей задаются в этом пространстве. Таким образом, если вы предварительно преобразуете (относительно небольшие) входные данные в касательное пространство в вершинном шейдере, вам не понадобятся дополнительные вычисления во фрагментном шейдере. Это требует, конечно, чтобы все входные данные были доступны. Я не делал рельефное отображение с отложенным затенением, но использование пространства модели кажется хорошей идеей. Мировое пространство, вероятно, было бы даже лучше, потому что в конце концов вам понадобятся векторы мирового пространства для рендеринга в G-буферы.

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

Если вам не нужна обратная матрица TBN, подойдет неортонормированная система координат. По крайней мере, я не вижу причин, почему это не должно.

person Nico Schertler    schedule 10.10.2013
comment
Спасибо. Для простоты я по-прежнему ортонормировал матрицу TBN, поэтому я могу использовать ту же формулу, и тогда шейдер не зависит от данных вершин, которые он получает (я могу просто написать другой шейдер, который использует типичный подход преобразования всего в касательное пространство). - person leemes; 13.10.2013