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

18.4. Объекты выборки в HLSL

Выборка для текстур в пиксельном шейдере осуществляется с помощью специальных встроенных функций HLSL tex*.

ПРИМЕЧАНИЕ
Под выборкой (sampling) мы понимаем выборку по индексу соответствующего пикселю текселя на основе координат текстуры для пикселя и режимов выборки (режимов фильтрации текстур).

В общем случае эти функции требуют, чтобы мы указали две вещи:

Координаты текстуры (u, v), как вы помните, передаются во входных данных пиксельного шейдера. Текстура, элемент которой нам надо получить, идентифицируется в пиксельном шейдере с помощью специального объекта HLSL, называемого объект выборки (sampler). Можно думать об объектах выборки как об объектах, идентифицирующих текстуру и этап выборки. Для примера предположим, что мы используем три этапа текстурирования, а значит в пиксельном шейдере нам требуется возможность ссылаться на каждый из этих этапов. Для этого в пиксельном шейдере напишем:

sampler FirstTex;
sampler SecondTex;
sampler ThirdTex;

Direct3D свяжет каждый из этих объектов выборки с уникальным этапом выборки. Затем в приложении мы определяем этап, которому соответствует объект выборки и устанавливаем для этого этапа требуемые текстуру и режимы выборки. Приведенный ниже код показывает, как приложение может установить текстуру и режимы выборки для FirstTex:

// Создание текстуры
IDirect3DTexture9* Tex;
D3DXCreateTextureFromFile(Device, "tex.bmp", &Tex);
.
.
.
// Получение дескриптора константы
FirstTexHandle = MultiTexCT->GetConstantByName(0, "FirstTex");

//Получение описания константы
D3DXCONSTANT_DESC FirstTexDesc;
UINT count;
MultiTexCT->GetConstantDesc(FirstTexHandle, &FirstTexDesc, &count);
.
.
.
// Устанавливаем текстуру/режимы выборки для
// объекта выборки FirstTex. Мы определяем этап с которым
// связан FirstTex по значению члена данных
// D3DXCONSTANT_DESC::RegisterIndex:
Device->SetTexture(FirstTexDesc.RegisterIndex, Tex);

Device->SetSamplerState(FirstTexDesc.RegisterIndex,
                           D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
Device->SetSamplerState(FirstTexDesc.RegisterIndex,
                           D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
Device->SetSamplerState(FirstTexDesc.RegisterIndex,
                           D3DSAMP_MIPFILTER, D3DTEXF_LINEAR);

 

ПРИМЕЧАНИЕ
Альтернативным способом, который может применяться вместо использования объектов выборки, является применение более специализированных и строго типизированных типов sampler1D, sampler2D, sampler3D и samplerCube. Эти типы обеспечивают большую безопасность типов и гарантируют, что будут использоваться только соответствующие функции tex*. Например, для объекта sampler2D могут применяться только функции tex2D*. Аналогично, для объекта sampler3D могут применяться только функции tex3D*.

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

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