Введение в программирование трехмерных игр с DX9

       

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

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

ПРИМЕЧАНИЕ

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

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

Координаты текстуры (u, v), используемые для индексации элементов текстуры.

Текстуру в которой выполняется индексация.

Координаты текстуры (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*.

Содержание раздела