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


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


  • Вычислим текущую вершину "c" нашей поверхности (просто взяв ее из массива data).
  • Затем вычислим нормаль n длиной 1 (в военное время длина нормали может достигать четырех! :) — прим. перев.) Обычно вектор нормали известен для каждой грани куба. Это важно, так как, получая нормализованные вектора, мы уменьшаем время расчета. Определим вектор освещения v от c к источнику света l.
  • Осталось рассчитать матрицу Mn для получения ортонормальной проекции. Получится f.
  • Вычислим сдвиг текстурных координат, умножив каждый из параметров s и t на v и MAX_EMBOSS: ds = s*v*MAX_EMBOSS, dt=t*v*MAX_EMBOSS. Обратите внимание: s, t и v — вектора, а MAX_EMBOSS — нет.
  • Во втором проходе добавим сдвиг к текстурным координатам.
  • Что в модели хорошего:

    • Она быстрая (вычисляется только один квадратный корень и пара умножений на вершину).
    • Она здорово выглядит.
    • Работает с любыми поверхностями, не только с плоскостями.
    • Работает на всех акселераторах.
    • glBegin/glEnd-совместима: не требует "запрещенных" GL-команд.

    Какие недостатки:

    • Модель не вполне физически корректна.
    • Остаются мелкие артефакты.

     

    На этом рисунке показано, где расположены вектора. t и s можно получить путем вычитания смежных векторов, но нужно следить за тем, чтобы они были верно направлены и нормализованы. Синей точкой помечена вершина, к которой проведена привязка texCoord2f(0.0f,0.0f).

     

    Конец теории ( Алгоритмы наложения микрорельефа методом тиснения )

    Давайте сначала рассмотрим формирование сдвига текстурных координат. Функция называется SetUpBumps(), потому что именно этим она и занимается:

     

    // Выполнение сдвига текстуры

    // n : нормаль к поверхности. Должна иметь длину 1

    // c : текущая вершина на поверхности (координаты местоположения)

    // l : положение источника света

    // s : направление s-координаты текстуры в пространстве объекта

    //     (должна быть нормализована!)

    // t : направление t-координаты текстуры в пространстве объекта

    //     (должна быть нормализована!)




    - Начало -  - Назад -  - Вперед -