В настоящее время я пытаюсь реализовать рельефное отображение, для которого требуется «касательное пространство». Я прочитал несколько руководств, в частности следующие два:
- http://www.terathon.com/code/tangent.html
- http://www.opengl-tutorial.org/intermediate-tutorials/tutorial-13-normal-mapping/
Оба руководства избегают дорогостоящих матричных вычислений во фрагментном шейдере, которые потребовались бы, если бы вычисления затенения происходили в пространстве камеры, как обычно (как я привык, по крайней мере).
Они вводят касательное пространство, которое может быть разным для каждой вершины (или даже для каждого фрагмента, если поверхность сглажена). Если я правильно понимаю, для эффективного бамп-мэппинга (т.е. для минимизации вычислений во фрагментном шейдере) они с помощью вершинного шейдера конвертируют все необходимое для расчета света в это касательное пространство. Но мне интересно, является ли модельное пространство хорошей альтернативой для вычисления затенения света.
Мои вопросы по этой теме:
Для расчета затенения в касательном пространстве, что именно я должен передать между вершинным и фрагментным шейдерами? Мне действительно нужно преобразовывать положения источников света в касательном пространстве, требуя
O(number of lights)
переменных переменных? Это, например, не будет работать для отложенного затенения или если положения источников света неизвестны по какой-либо другой причине в вершинном шейдере. Должна быть (все еще эффективная) альтернатива, которая, как я полагаю, представляет собой вычисление затенения в пространстве модели.Если я передам варианты пространства модели, будет ли хорошей идеей выполнять вычисления затенения в касательном пространстве, т.е. преобразовывать положения источников света во фрагментном шейдере? Или лучше выполнять вычисления затенения в пространстве модели? Что будет быстрее? (В обоих случаях мне нужна матрица TBN, но в одном случае требуется преобразование модели в касательную, а в другом — преобразование касательной в модель.)
В настоящее время я передаю вершинному шейдеру нормаль, касательную и бикасательную (ортонормальную) вершину. Если я правильно понимаю, ортонормирование требуется только в том случае, если я хочу быстро построить матрицу модели к касательному пространству, для которой требуется инверсия матрицы, содержащей векторы TBN. Если они ортогональны, это просто транспозиция. Но если мне не нужны векторы в касательном пространстве, мне нужна не инверсия, а просто исходные векторы TBN в матрице, которая затем является матрицей касательной к модели. Не упростит ли это все?