Готовый перевод Ogre3D Intermediate Tutorials / Промежуточные туториалы Ogre3D: Intermediate Tutorial 6: Projective Decals

Внимание! Этот перевод, возможно, ещё не готов, так как модераторы установили для него статус «перевод редактируется»

ВВЕДЕНИЕ

В этом уроке мы рассмотрим добавление проективных декалей на объекты сцены.

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

Вот снимок экрана с изображением текстуры, спроецированной на любимую каждому голову Огра:

С ЧЕГО НАЧАТЬ

НОВЫЕ ТЕКСТУРЫ

Перед тем как мы начнем наш проект, мы должны добавить две текстуры, которые будем потом использовать:

Лучше всего положить эти файлы в папку <tt>media/materials/textures</tt> (для большинства людей эта папка располагается в папке SDK Ogre).

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

НАЧАЛЬНЫЙ КОД

Настройте свой проект Intermediate Tutorial 6 подобно тому, что показано ниже:

Скомпилируйте и запустите программу перед тем как мы продолжим.

Вы должны увидеть шесть голов огра.

ПРОЕКЦИОННЫЕ ДЕКАЛИ

КОНУС ОТСЕЧЕНИЯ

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

Огр использует это для отображения с камер( класс Camera напрямую наследуется от класса Frustum)

В этом уроке мы будем использовать конус отсечения для проецирования декалей на наши объекты(меши) в сцене.

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

Найдите метод createProjector() и добавьте следующий код:

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

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

setOrthoWindowHeight() используется вместе с соотношением сторон и устанавливает размер ортографического конуса.

Перед тем как продолжить, примите к сведению куда наш конус будет проецировать декаль.

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

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

ИЗМЕНЯЕМ МАТЕРИАЛ

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

Мы сделаем это путем добавление нового прохода, который будет рендерится поверх основной текстуры.

Конус отсечения определяет положение. размеры и форму проецируемой декали.

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

Первое что мы сделаем - это добавим материалу еще один проход.

Найдите метод makeMaterialReceiveDecal() и добавьте следующий код:

После создания прохода мы должны настроить освещение и смешивание.

Мы добавим новую текстуру, которая будет корректно смешиваться с текущей текстурой на объекте.

Для этого установим тип смешивания по прозрачному альфа-каналу и выставим смещение глубины в 1 (таким образом, наша декаль останется непрозрачной)

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

Если вы хотите, чтобы цвет декали в вашем приложении зависел от освещения, не добавляйте последний код в вашу функцию:

После создания прохода, необходимо создать текстурную единицу используя нашу текстуру decal.png

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

Последние две функции устанавливают фильтрацию и тип адресации текстурных координат.

Мы установили режим адресации Clamp( заделка ), таким образом наша текстура не будет повторятся на объекте.

В опциях фильтрации текстур указываем следующие параметры: при приближении к объекту использовать стандартную линейную фильтрацию, при удалении - не использовать фильтрацию, использование мипмап отключено.

Это предотвращает размытие прозрачной границы декали по текстуре.

Если мы этого не сделаем, то получим отвратительные размытия по всей текстуре там, где не наложена наша декаль.

Это все, что необходимо для установки материала.

ВЫЗОВ ФУНКЦИЙ

Мы создали необходимые методы, теперь мы должны вызвать их для создания проектора и создания материалов.

Добавьте следующий код в конец метода createScene:

Отметим, что переменная ent хранит в себе указатель на последнюю созданную в цикле голову огра. Поскольку все головы используют один и тот же материал. нам необходимо взять произвольную голову и получить имя используемого материала.

Скомпилируйте и запустите приложение, вы должны увидеть несколько голов Огра с текстурой декали, спроецированной на них.

ИЗБАВЛЯЕМСЯ ОТ ЗАДНЕЙ ПРОЕКЦИИ

ВВЕДЕНИЕ

Как вы, возможно, могли заметить, в нашем приложении присутствует сразу две проекции.

Первая - проекция вдоль направления -Z, то куда направлен наш конус отсечения, другая проекция направлена вдоль направления +Z, на головы позади нашего конуса.

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

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

ИЗМЕНЯЕМ ПРОЕКТОР

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

Добавьте следующий код в метод createProjector():

Это должно быть вам уже знакомо.

Разница лишь в том, что мы повернули узел на 90 градусов для ориентирования его в обратном направлении.

ИЗМЕНЯЕМ МАТЕРИАЛ

Теперь мы должны добавить еще один текстурный модуль в проход который мы создали ранее.

Добавьте следующий код в метод makeMaterialReceiveDecal() :

Это все должно быть знакомо вам.

Отметим, что поскольку мы используем фильтр-текстуру и фильтрующий конус отсечения, то мы отключаем текстурную фильтрацию.

Скомпилируйте и запустите приложение.

Вы должны увидеть только проекцию по направлению нашего проектора.

СКРЫТИЕ ПРОЕКЦИЙ

ПРОСТОЕ ВРАЩЕНИЕ

Для того чтобы скрыть проекции, мы будем вращать проектор.

Для этого просто добавьте следующий код в начало метода frameRenderingQueued() :

Скомпилируйте и запустите приложение.

Вы должны увидеть проецирование текстуры вдоль всего круга голов Огра.

НАПОСЛЕДОК

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

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

Осмотримся.

Предыдущий совет верен, но есть решение, когда ваша текстура не имеет прозрачной внешней границы:

До тех пор, пока формат вашей текстуры поддерживает альфа-канал( напр. PNG), вы можете установить текстурную адресацию в режим TAM_BORDER( граница )( или border, если вы используете скрипт материала ) и установить цвет границы равный (0,0,0,0).

Это приведет к тому, что при использовании текстурных координат вне диапазона [0,1] мы получим цвет границы, который мы указали.

По существу. вы только что добавили своей текстуре прозрачные границы.

Вы можете посмотреть быстрое включение проекционных текстур в ваш проект.

Внимание! Этот перевод, возможно, ещё не готов.
Его статус: перевод редактируется

Переведено на Нотабеноиде
http://notabenoid.org/book/20063/65478

Переводчики: H0tHead, Mingun, proVIDec

Настройки

Готово:

100.00% КП = 1.0