6.3.Генерация текстурных координат Помимо прямого задания текстурных координат Direct3D API позволяет вычислять текстурные координаты на основе некоторых данных или изменять текущие текстурные координаты.
Схема получения текстурных координат показана на рис. 9.
Рис. 9. Схема вычисления текстурных координат Как показано на рис. 9 вычисление текстурных координат можно разделить на два этапа: получение текстурных координат из источника и трансформация полученных текстурных координат. Второй этап является опциональным.
За выбор источника отвечает уже знакомая нам настройка D3DTSS_TEXCOORDINDEX, задаваемая через SetTextureStageState().
Помимо прямого задания номера текстурного канала эта величина может принимать значения:
D3DTSS_TCI_CAMERASPACENORMAL – нормаль в вершине, заданная в системе координат камеры
D3DTSS_TCI_CAMERASPACEPOSITION – позиция вершины, заданная в системе координат камеры
D3DTSS_TCI_CAMERASPACEREFLECTIONVECTOR – вектор отражения в вершине, заданный в системе координат камеры.
Вектор отражения вычисляется по следующей формуле
,
где - нормаль в вершине, а - нормализованное направление от вершины к наблюдателю.
Флаг D3DTSS_TCI_SPHEREMAP, который может использоваться совместно с индексом текстурного канала или любым из перечисленных выше значений, включает пересчет текстурных координат для выборки из сферически заданной текстуры окружения (spherical environment map).
Перейдем к рассмотрению трансформации полученных текстурных координат. За управление трансформацией отвечает настройка D3DTSS_TEXTURETRANSFORMFLAGS, задающая, как следует из названия, флаги трансформации, которые могут принимать следующие значения:
D3DTTFF_DISABLE – выключает трансформацию,
D3DTTFF_COUNT1..4 – включает трансформацию и выставляет соответствующую размерность текстурных координат,
D3DTTFF_PROJECTED – дополнительный флаг, включающий деление на последнюю компоненту текстурных координат.
При включенной трансформации производится умножение текстурных координат на матрицу, заданную с помощью метода SetTransform() c первым параметром D3DTS_TEXTUREi (i от 0 до 7). Индекс определяет номер текстурного этапа, в который установлена текстура.
Рассмотрим применение генерации текстурных координат на случае, когда пользователю необходимо сделать так, чтобы текстурные координаты соответствовали экранным. Такое часто бывает нужно для различных эффектов.
Допустим, требуется сгенерировать описанным образом текстурные координаты для 1-ого текстурного этапа. Для этого используем следующий код:
pDev->SetTextureStageState(1, // номер канала
D3DTSS_TEXCOORDINDEX,
// используем позицию вершины в камерной системе
D3DTSS_TCI_CAMERASPACEPOSITION); // Используем ту же матрицу проецирования, что и для D3DTS_PROJECTION
D3DMATRIX projMatrix;
pDev->SetTransform(D3DTS_TEXTURE1, &projMatrix); pDev->SetTextureStageState(1, D3DTSS_TEXTURETRANSFORMFLAGS,
D3DTTFF_COUNT4 | // Будем делить на w, поэтому устанавливаем 4
// координаты
D3DTTFF_PROJECTED // Включаем проецирование (деление на w)
);
6.4.Выборка из текстуры Как уже упоминалось в п. 6.2, после получения текстурных координат конкретной точки на поверхности треугольника (или, при растеризации, текстурных координат в пикселе), по ним осуществляется выборка цвета из текстуры. Этот процесс можно разбить на две стадии: адресацию и фильтрацию. Адресация переводит текстурные координаты из R2 в [0,1]2. Фильтрация осуществляет интерполяцию между дискретными пикселями, чтобы получающаяся в результате функция цвета текстуры от положения внутри треугольника была непрерывной.
Запишем функцию адресации в виде . Будем рассматривать скалярную функцию a(t), так как Direct3D позволяет задавать режим адресации покомпонентно.
Наиболее часто используются два режима адресации (см. результаты на рис. 10):
Repeat (или wrap), задающий повторение текстуры: 11,
Clamp: .
Рис. 10. Иллюстрация адресации. Слева “шахматная” текстура со знаком @, по центру квадрат с текстурными координатами (0,0) в левом нижнем углу, (2.9,2.9) в правом верхнем. Используется адресация wrap. Справа, такой же квадрат, но с адресацией clamp. Настройки адресации, являются настройками способа выборки цвета из текстуры и устанавливаются вызовами SetSamplerState().
IDirect3DDevice9::SetSamplerState(
stageIndex, // номер stage
D3DSAMP_ADDRESSU, // или D3DSAMP_ADDRESSV
addressMode // режим адресации D3DTADDRESS_WRAP или _CLAMP
); Настройки фильтрации также устанавливаются вызовами SetSamplerState().
IDirect3DDevice9::SetSamplerState(
stageIndex, // номер stage
D3DSAMP_MAGFILTER, // или D3DSAMP_MINFILTER или D3DSAMP_MIPFILTER
filterMode // режим фильтрации D3DTEXF_XXX
);
DirectX позволяет задавать три типа фильтрации:
D3DSAMP_MAGFILTER – magnification фильтрация, применяющаяся когда размер текселя на экране больше пикселя. Возможные значения:
D3DTEXF_POINT, D3DTEXF_LINEAR.
D3DSAMP_MINFILTER – minification фильтрация, применяющаяся когда размер текселя на экране меньше пикселя. Возможные значения:
D3DTEXF_POINT, D3DTEXF_LINEAR, D3DTEXF_ANISOTROPIC12.
D3DSAMP_MIPFILTER – фильтрация между двумя соседними мипмапами. Возможные значения:
D3DTEXF_NONE, D3DTEXF_POINT, D3DTEXF_LINEAR.
|