netlib.narod.ru< Назад | Оглавление | Далее >

6.5. Режимы адресации

Раньше мы утверждали, что координаты текстур должны находиться в диапазоне [0, 1]. С технической точки зрения это неверно, и координаты могут выходить за указанный диапазон. Поведение Direct3D в том случае, если координаты выходят за диапазон [0, 1] определяется установленным режимом адресации. Поддерживаются четыре режима адресаци: обертывание (wrap), цвет рамки (border color), одиночное наложение (clamp) и отражение (mirror), которые показаны на рис. 6.5, 6.6, 6.7 и 6.8 соответственно.


Рис. 6.5. Режим обертывания

Рис. 6.5. Режим обертывания

Рис. 6.6. Режим цвета рамки

Рис. 6.6. Режим цвета рамки

Рис. 6.7. Режим одиночного наложения

Рис. 6.7. Режим одиночного наложения

Рис. 6.8. Режим отражения

Рис. 6.8. Режим отражения


На этих рисунках координаты текстур для четырех вершин квадрата определены следующим образом: (0, 0), (0, 3), (3, 0) и (3, 3). Поскольку по осям U и V размер равен трем единицам, квадрат делится на матрицу 3 × 3. Если, к примеру, вы хотите, чтобы текстура накладывалась в виде матрицы размером 5 × 5, включите режим обертывания и задайте координаты текстур (0, 0), (0, 5), (5, 0) и (5, 5).

Приведенный ниже фрагмент кода взят из программы AddressModes и показывает, как устанавливаются четыре режима адресации:

// Установка режима обертывания
if (::GetAsyncKeyState('W') & 0x8000f)
{
     Device->SetSamplerState(0, D3DSAMP_ADDRESSU, D3DTADDRESS_WRAP);
     Device->SetSamplerState(0, D3DSAMP_ADDRESSV, D3DTADDRESS_WRAP);
}

// Установка режима цвета рамки
if (::GetAsyncKeyState('B') & 0x8000f)
{
     Device->SetSamplerState(0, D3DSAMP_ADDRESSU, D3DTADDRESS_BORDER);
     Device->SetSamplerState(0, D3DSAMP_ADDRESSV, D3DTADDRESS_BORDER);
     Device->SetSamplerState(0, D3DSAMP_BORDERCOLOR, 0x000000ff);
}

// Установка режима отсечения
if (::GetAsyncKeyState('C') & 0x8000f)
{
     Device->SetSamplerState(0, D3DSAMP_ADDRESSU, D3DTADDRESS_CLAMP);
     Device->SetSamplerState(0, D3DSAMP_ADDRESSV, D3DTADDRESS_CLAMP);
}

// Установка режима отражения
if (::GetAsyncKeyState('M') & 0x8000f)
{
     Device->SetSamplerState(0, D3DSAMP_ADDRESSU, D3DTADDRESS_MIRROR);
     Device->SetSamplerState(0, D3DSAMP_ADDRESSV, D3DTADDRESS_MIRROR);
}

netlib.narod.ru< Назад | Оглавление | Далее >

Сайт управляется системой uCoz