Народный учебник по OpenGL


Урок 22. Наложение микрорельефа - часть 15


  • Вычислить сдвиги координат текстуры (ds,dt)
  • Вычислить коэффициент рассеяния Fd (управляется с помощью освещения в OpenGL — прим. Дженса)
  • Обе величины используют вектора нормали N и освещения L (в нашем случае явным образом вычисляются только (ds,dt) — прим. Дженса)
  • Теперь займемся математикой
  • Создание текстуры

     

    Берегите текстуры!

    • В настоящее время аппаратура мультитекстурирования поддерживает максимум две текстуры! (Это утверждение устарело, но его надо иметь в виду, если хотите сохранить обратную совместимость — прим. Дженса)
    • Рельеф использует канал АЛЬФА (у нас это не так; но если на вашей машине карточка с чипом TNT, можете попробовать повторить предложенное здесь самостоятельно — прим. Дженса)

    • Максимальная высота = 1.0
    • Уровень нулевой высоты = 0.5
    • Максимальная глубина = 0.0

  • Цвета поверхности — каналы RGB
  • Внутренний формат должен быть GL_RGBA8 !!
  • Вычисление смещения текстур

     

    Отображение вектора освещения в пространство нормали

    • Нужно получить систему координат нормали
    • Создадим систему координат из нормали к поверхности и вектора "вверх" (мы передаем направления texCoord генератору смещения в явном виде — прим. Дженса)

    • Нормаль — ось z
    • Перпендикулярно ей идет ось x
    • Направление "вверх", или ось y, получена как произведение x- и z-векторов

  • Построим матрицу 3x3 Mn из осей
  • Отобразим вектор освещения в пространстве нормали.(Mn называют также ортонормальным базисом. Можете рассматривать Mn*v как представление v в базисе, формирующем касательное пространство, а не обычное. Заметьте, что ортонормальный базис инвариантен к масштабированию, то есть при умножении векторов нормализация не теряется! — прим. Дженса)
  • Вычисление смещения текстур (продолжение)

     

    Используем вектор освещения в пространстве нормали для смещения

    • L’ = Mn x L
    • Используем L’x, L’y для (ds,dt)
    • Используем L’z как коэффициент диффузного отражения (Совсем нет! Если вы не владелец TNT-карточки, используйте освещение OpenGL, потому что вам обязательно придется выполнять дополнительный проход — прим. Дженса)