Спонсор: Microsoft
Опубликован: 08.07.2007 | Доступ: свободный | Студентов: 1359 / 138 | Оценка: 4.43 / 4.02 | Длительность: 13:47:00
Специальности: Программист
Лекция 3:

Текстурирование

< Лекция 2 || Лекция 3: 1234 || Лекция 4 >
Аннотация: Данная лекция широко рассматривает понятие текстурирования. Рассматриваются также понятия полигона, примитивов, мультитекстурирования и др. Приводятся практические примеры применения текстурирования и реализация на языках C++ и Pascal

Текстурирование

До сих пор выводимые на экран примитивы строились только с помощью синтетических цветов. Для того чтобы придать им большей реалистичности можно прибегнуть к помощи текстур. Текстура представляет собой двумерное растровое изображение, которое накладывается (натягивается) на поверхность объекта, например на плоский треугольник. Текстуры, как правило, хранятся в графических файлах форматов bmp, jpeg, tiff, tga, gif. Библиотека Direct3D содержит богатый набор функций для работы с текстурами. Процесс наложения текстуры на объект называют текстурированием. Текстуры накладываются на объект с помощью так называемых текстурных координат. Текстурные координаты представляют собой пару чисел (u,v), изменяющихся в пределах от 0 до 1, и определяются в своей системе координат. Ось u направлена горизонтально вправо, ось v - вертикально вниз. Пара величин (u,v) однозначно указывает на элемент текстуры, называемый текселем.


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


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

C++
struct MYVERTEX
{
    FLOAT x, y, z, rhw;
    FLOAT u, v; // текстурные координаты
};

#define MY_FVF (D3DFVF_XYZRHW|D3DFVF_TEX1)
Pascal
type
MyVertex = packed record
    x, y, z, rhw: Single;
    u,v: Single; // текстурные координаты
end; 

const
      MY_FVF = D3DFVF_XYZRHW or D3DFVF_TEX1;

Теперь при заполнении данных о вершинах необходимо также указывать и текстурные координаты для каждой вершины текстурируемого примитива. Работа с текстурами в Direct3D осуществляется с помощью интерфейса IDirect3DTexture9. Для этого нужно объявить соответствующую переменную.

C++ LPDIRECT3DTEXTURE9 tex = NULL;
Pascal
var
   tex: IDirect3DTexture9;

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

C++ #include <d3dx9.h>
Pascal uses …, D3DX9,…

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

C++ D3DXCreateTextureFromFile( device, "texture.bmp", &tex )
Pascal D3DXCreateTextureFromFile( device, 'texture.bmp', tex );

Последний шаг в работе с текстурами заключается в активации нужной текстуры перед выводом примитивов. Реализуется это с помощью вызова метода SetTexture интерфейса IDirect3DDevice9. Данный метод имеет два параметра: первый определяет номер так называемого текстурного уровня, а второй – указатель на загруженную текстуру. Библиотека Direct3D поддерживает до восьми текстурных уровней, но если вы работаете только с одной текстурой, то номер текстурного уровня всегда должен быть нулем. Установка (загрузка текстуры в текстурный уровень) текущей текстуры осуществляется, как правило, в теле функции вывода (рендеринга).

C++ device->SetTexture ( 0, tex );
Pascal device.SetTexture( 0, tex );

Если в сцене присутствуют несколько объектов с различными текстурами, то процесс установки текстуры и вывода примитивов должен быть последовательным:

SetTexture ( 0, tex1 );
drawObject1();

SetTexture ( 0, tex2 );
drawObject2();

Для деактивации текстуры в некотором текстурном уровне достаточно вызвать метод SetTexture с нулевым (пустым) значением второго параметра.

C++ device->SetTexture ( 0, 0 );
Pascal device.SetTexture( 0, nil );

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


< Лекция 2 || Лекция 3: 1234 || Лекция 4 >
Олег Корсак
Олег Корсак
Латвия, Рига
Ренат Файзуллин
Ренат Файзуллин
Россия, Казань