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

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

< Лекция 2 || Лекция 3: 1234 || Лекция 4 >

Фильтрация текстур – это механизм, с помощью которого библиотека Direct3D производит наложение текстуры на полигоны отличающегося размера. Наиболее распространенными по использованию являются следующие типы фильтрации текстур:

  1. точечная фильтрация (используется по умолчанию) – самая быстрая по скорости, но самая низкая по качеству;
  2. линейная фильтрация – приемлемое качество и скорость;
  3. анизотропная – самая медленная, но самая качественная.

Программно установить тот или ной тип фильтрации можно с помощью вызова метода SetSamplerState интерфейса IDirect3DDevice9:

SetSamplerState( 0, D3DSAMP_MINFILTER, <тип фильтрации> )
SetSamplerState( 0, D3DSAMP_MAGFILTER, <тип фильтрации> ),

где <тип фильтрации> – одна из следующих констант:

D3DTEXF_POINT – точечная фильтрация,

D3DTEXF_LINEAR – линейная фильтрация,

D3DTEXF_ANISOTROPIC – анизотропная фильтрация;

константы D3DSAMP_MAGFILTER и D3DSAMP_MINFILTER указывают на то, что размер текстуры меньше и больше размеров полигона соответственно.

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



D3DTEXF_POINT D3DTEXF_LINEAR

На самом деле значения текстурных координат могут выходить за пределы отрезка [0,1]. Как при этом будет себя "вести" текстура зависит от установленного режима адресации. Существует 4 типа адресации текстур:

  1. wrap
  2. border color
  3. clamp
  4. mirror

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


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

SetSamplerState( 0, D3DSAMP_ADDRESSU, D3DTADDRESS_WRAP );
SetSamplerState( 0, D3DSAMP_ADDRESSV, D3DTADDRESS_WRAP );

SetSamplerState( 0, D3DSAMP_ADDRESSU, D3DTADDRESS_BORDER );
SetSamplerState( 0, D3DSAMP_ADDRESSV, D3DTADDRESS_BORDER );
SetSamplerState( 0, D3DSAMP_BORDERCOLOR, D3DCOLOR_XRGB(64,64,0) );

SetSamplerState( 0, D3DSAMP_ADDRESSU, D3DTADDRESS_CLAMP );
SetSamplerState( 0, D3DSAMP_ADDRESSV, D3DTADDRESS_CLAMP );

SetSamplerState( 0, D3DSAMP_ADDRESSU, D3DTADDRESS_MIRROR );
SetSamplerState( 0, D3DSAMP_ADDRESSV, D3DTADDRESS_MIRROR );

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

C++
struct CUSTOMVERTEX
{
    FLOAT x,  y,  z, rhw;      // координаты вершины
    DWORD color;       // цвет вершин
    FLOAT tu, tv;         // текстурные координаты
};
#define MY_FVF (D3DFVF_XYZRHW | D3DFVF_ DIFFUSE | D3DFVF_TEX1)
Pascal
type
MyVertex = packed record
      x, y, z, rhw: Single; // координаты вершины
      color: DWORD; // цвет вершин 
      u,v: Single; // текстурные координаты
end;

const
MY_FVF = D3DFVF_XYZRHW or D3DFVF_DIFFUSE or D3DFVF_TEX1;

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


< Лекция 2 || Лекция 3: 1234 || Лекция 4 >