OpenGL ES 2.0 для каждого фрагмента освещения для нетекстурированной сгенерированной геометрии - PullRequest
2 голосов
/ 02 сентября 2011

Я сейчас генерирую геометрию, а не импортирую ее как модель. Это делает необходимым вычисление всех нормалей в приложении.

Я успешно применил затенение Гуро (для освещения вершины) и теперь хочу реализовать затенение Фонга (для фрагмента / пикселя).

Я просмотрел соответствующие учебные пособия в Интернете, и есть два лагеря: один предлагает простую перестановку кода шейдера по методу Гуро-Фонга, которая, хотя и предлагает улучшенное освещение, не является по-настоящему пиксельной. Вторая делает все правильно, используя карты нормалей, встроенные в текстуры, но они генерируются в наборе инструментов моделирования, таком как RenderMonkey.

Мои вопросы:

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

  2. Должен ли я хранить сгенерированные нормали в текстуре, как показано на примере онлайн, и если да, то как мне поступить в коде? чем через программное обеспечение для моделирования?

Ответы [ 2 ]

2 голосов
/ 02 сентября 2011

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

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

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

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

  2. Сначала вы должны попробовать простое попиксельное освещение, прежде чем углубляться в методы, такие как нормальное отображение.Если у вас не такая точная мозаика геометрии или очень блестящие поверхности, вы наверняка увидите разницу с простым освещением на вершину.Затем, когда это сработает, вы можете попробовать обычные методы картирования, но для их работы вам, безусловно, нужно сначала понять значение освещения на пиксель и затенения Фонга в отличие от затенения Гуро.

0 голосов
/ 02 сентября 2011

Карты нормалей являются , а не требованием для освещения на пиксель.

Единственное требование, по определению, состоит в том, чтобы решение по освещению оценивалось для каждого выходного пикселя / фрагмента. Вы можете также хранить нормали в вершинах (и более легко).

Карты нормалей могут предоставлять полные данные нормалей (карты rgb) или просто модулировать сохраненные нормали вершин (карты du / dv, отображаются красным / синим цветом). Последняя форма, возможно, более распространена и зависит от нормалей вершин, чтобы функционировать.

Создание нормалей зависит от вашего кода и геометрии. Как правило, вы используете точечные продукты и окружающие грани или вершины для сглаживания нормалей или просто создаете единичный вектор, указывающий на то, что «вне» для вашей геометрии.

...