6.2.Наложение текстуры: текстурные координаты В данном параграфе мы рассмотрим понятие “наложения” текстуры на объект. “Наложение” будем понимать том смысле, что каждой точке на поверхности объекта сопоставляется точка в текстурном пространстве R2 (см. рис. 7). Эта точка используется для вычисления цвета текстуры на поверхности объекта (выборке цвета из текстуры, texture sampling).
Рис. 7. Текстурное пространство. UV координаты в интервале [0,1] соответствуют самой текстуре. Значение текстуры вне квадрата [0,1]2 вычисляется в зависимости от выбранного способа адресации, которые рассматриваются в пункте 6.2. Сопоставление точки на поверхности и точки в текстурном пространстве осуществляется путем задания текстурных координат в вершинах объекта. Таким образом, вершина помимо позиции, цвета и нормали содержит два числа, которые для каждого треугольника определяют искомое преобразование (см. рис. 8), которое может быть записано так
,
здесь - позиция i-ой вершины, - ее текстурные координаты.
Рис. 8. Переход от точки на поверхности объекта в текстурное пространство. Здесь - позиция, а - текстурные координаты i-ой вершины. Фактически, преобразование не вычисляется, а текстурные координаты интерполируются по треугольнику так же, как это делается с цветами.
В Direct3D, при использовании уже привычных нам FVF флагов, текстурные координаты кладутся в конец вершины. При этом в вершине может быть до 8 каналов текстурных координат различных размеров (текстурные координаты могут быть размерностью от 1 до 4).
Задавая FVF флаги для текстурных координат необходимо устанавливать количество каналов D3DFVF_TEXn (n = 0..8) и размерность для каждого канала D3DFVF_TEXCOORDSIZEm(i) (m = 1..4 – размерность канала, i = 0..n-1 – индекс текстурного канала).
Рассмотрим вершину объекта, предназначенного для освещения и наложения двух текстур (вершина содержит 2 канала текстурных координат).
struct Vertex
{
float x, y, z; // позиция
float nx, ny, nz; // нормаль
float u0, v0; // 0-й текстурный канал
float u1, v1, w1; // 1-ый текстурный канал
};
Описание этой вершин задается следующей комбинацией FVF флагов: D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_TEX2 | D3DFVF_TEXCOORDSIZE2(0) | D3DFVF_TEXCOORDSIZE3(1).
Теперь рассмотрим, каким образом определяется, какой канал текстурных координат используется для какой текстуры. В простейшем случае, когда текстура одна – все очевидно: это 0-ой канал. Однако когда текстур становится больше, необходимо устанавливать соответствие между текстурным этапом и каналом текстурных координат. Это делается с помощью метода SetTextureStageState():
IDirect3DDevice9::SetTextureStageState(
stageIndex, // номер этапа
D3DTSS_TEXCOORDINDEX,
channelIndex // номер канала
);
Таким образом, можно задать, что две текстуры в 0 и 1 ом этапе используют один канал текстурных координат, например, 0-й.
IDirect3DDevice9 *pDev = …;
pDev->SetTextureStageState(0, D3DTSS_TEXCOORDINDEX, 0);
pDev->SetTextureStageState(1, D3DTSS_TEXCOORDINDEX, 0);
|