2010-09-26 5 views
8

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

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

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

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

ответ

6

Я рекомендую вам взглянуть на:

This nvidia presentation on bumb mapping

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

This other nvidia tutorial for implementing bump mapping in the cg shader langauge

This bump mapping tutorial might also be helpful.

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

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

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

+0

Спасибо, презентация nVidia и 3DKingdoms отличные. Я видел paulsprojects один, но я был потерян, когда он начал на картах куба. – zyndor

5
  • Что делать, когда у меня есть нормальная карта?
  • Нужно ли регистрировать его с помощью OpenGL?

Да, вам необходимо загрузить его в качестве текстуры.

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

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

  • Как это отображается на текстурированной четырехугольника 2D?

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

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

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

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

+0

большое, мультитекстурирование - это то, что у меня на уме (и да, я пойду с шейдерами =)). благодаря! – zyndor

1

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

1) & 2)

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

3)

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

4)

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

5)

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

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

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

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

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

Смежные вопросы