Как применить карту нормалей в OpenGL? - PullRequest
8 голосов
/ 26 сентября 2010

Я учусь использовать карты нормалей (на пиксель освещения?) В 2D-графике с OpenGL.

Новое в отображении нормалей, мне удалось обернуть голову вокруг оператора Собеля и генерации карт нормалей (в основном благодаря this ), то есть создание (2D) массива нормалей из ( 2D) массив данных пикселей.

(Большинство найденных мной учебных пособий и веток форума были посвящены использованию 3D и программному обеспечению для моделирования. Я стремлюсь реализовать эту функцию самостоятельно, в C ++.)

  • Что мне делать, когда я получил нормальный карта
  • Нужно ли мне регистрировать это OpenGL
  • Должно ли это быть связано с текстурой, если да, то как это сделано?
  • Как это отображается в 2D текстурированный квад?
  • (Это то, что Я могу обойтись без шейдеров / GLSL?)

Ответы [ 3 ]

6 голосов
/ 26 сентября 2010

Рекомендую посмотреть на:

Это презентация NVIDIA по отображению Бомба

Я некоторое время не смотрел на это, но я помню, как он рассмотрел большинство деталей при реализации шейдера рельефной карты, и должно быть реализовано несколько идей.

Этот другой учебник nvidia для реализации рельефного отображения в языке шейдеров cg

Этот учебник по рельефному отображению также может быть полезен .

Я знаю, что все это не для полного нормального отображения, но это хорошее начало.

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

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

5 голосов
/ 26 сентября 2010
  • Что мне делать, если у меня есть карта нормалей?
  • Нужно ли мне регистрировать ее в OpenGL?

Да, вам нужно загрузить его как текстуру.

  • Нужно ли связывать его с текстурой, если да, как это делается?

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

  • Как она отображается в квадрате с текстурированной 2D?

Ваша карта нормалей - это просто еще одна текстура, вы привязываете ее и наносите на карту как любую другую текстуру.

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

  • (Это то, что я могу сделать без шейдеров / GLSL?)

Да, вы можете использовать некоторые устаревшие расширения для программирования функций комбинирования среды с несколькими текстурами.Никогда не делал это сам, но это похоже на ад.

1 голос
/ 08 ноября 2016

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

1) & 2)

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

3)

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

4)

карты нормалей отображаются с теми же координатами текстуры, что и у диффузной текстуры ... это означает, что если у вас есть квадрат с координатами0; 0, 0; 1, 1; 0, 1; 1 это координаты, которые вы используете для сопоставления обеих текстур.

5)

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

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

С картами нормалей вы не используете вектор нормали вершины, а вектор нормали, закодированный в текстуре.

Во-первых, вам нужно будет преобразовать расчет освещения из мирового пространства в касательное пространство. Это делается в вершинном шейдере.

Затем вы получите образец карты нормалей в фрагментном шейдере, какобычная текстура. Вы получите RGB цвет вашего пикселя.вам нужно будет преобразовать это значение в вектор нормалей, то есть умножить его на 2 и вычесть 1, т. е. rgb * 2 - 1, а затем использовать его в качестве вектора нормалей при расчете освещения.

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