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

19.2. Встроенные объекты HLSL

Сейчас мы обсудим несколько встроенных объектных типов HLSL. Мы не обсуждали их раньше потому что они используются главным образом в каркасе эффектов.

19.2.1. Объекты текстуры

Встроенный тип HLSL texture представляет объект IDirect3DTexture9. Используя объект texture мы можем связывать текстуру с заданным этапом выборки непосредственно в файле эффекта. У объекта texture есть следующие доступные члены данных:

 

ПРИМЕЧАНИЕ
До сих пор мы использовали текстуры только для хранения изображений, но познакомившись с провессиональными техниками вы обнаружите, что текстуры применяются для хранения произвольной табличной информации. Другими словами, текстура — это просто таблица с данными; совсем необязательно, чтобы она хранила изображение. Например, в рельефном текстурировании (bump mapping) используются карты нормалей (normal map), представляющие собой текстуры, содержащие векторы нормалей для каждого элемента.

19.2.2. Объекты выборки и режимы выборки

Мы обсуждали объекты выборки в главе 18; однако каркас эффектов добавляет новое ключевое слово sampler_state. С помощью ключевого слова sampler_state мы можем инициализировать объект sampler (то есть, устанавливать текстуру и режимы выборки для объекта выборки непосредственно из файла эффкетов). Следующий фрагмент кода иллюстрирует эту возможность:

Texture Tex;

sampler S0 = sampler_state
{
     Texture   = (Tex);
     MinFilter = LINEAR;
     MagFilter = LINEAR;
     MipFilter = LINEAR;
};

Здесь мы связываем текстуру Tex с этапом текстурирования, которому соответствует объект S0, а также задаем режимы выборки для этапа выборки, которому соответствует S0. Все эти параметры мы явно устанавливаем непосредственно из файла эффектов!

19.2.3. Объекты вершинных и пиксельных шейдеров

Встроенные типы HLSL vertexshader и pixelshader представляют вершинные и пиксельные шейдеры соответственно. Они используются в каркасе эффектов для ссылки на конкретный вершинный и/или пиксельный шейдер, который должен использоваться в данном проходе визуализации. Типы vertexshader и pixelshader могут инициализироваться из приложения через интерфейс ID3DXEffect с помощью методов ID3DXEffect::SetVertexShader и ID3DXEffect::SetPixelShader соответственно. Например, пусть Effect — это корректный объект ID3DXEffect, VS — это корректный объект IDirect3DVertexShader9 и VSHandle  — это значение типа D3DXHANDLE, которое ссылается на объект vertexshader в файле эффекта; тогда мы можем инициализировать вершинный шейдер, на который ссылается VSHandle написав:

Effect->SetVertexShader(VSHandle, VS);

Мы больше узнаем о методах SetVertexShader и SetPixelShader когда будем обсуждать инициализацию переменных файла эффекта из приложения.

Кроме того, мы можем написать вершинный и/или пиксельный шейдер непосредственно в файле эффекта. Затем, используя специальный синтаксис компиляции мы можем инициализировать переменную шейдера. Приведенный ниже фрагмент кода показывает инициализацию переменной ps типа pixelshader.

// Определение Main:
OUTPUT Main(INPUT input){...}

// Компиляция Main:
pixelshader ps = compile ps_2_0 Main();

Обратите внимание, что после ключевого слова compile мы указываем версию шейдеров, а за ней — имя точки входа шейдера. Заметьте, что при использовании такого стиля для инициализации объектов вершинных/пиксельных шейдеров, функция, являющаяся точкой входа, должна быть определена в файле эффекта.

И, наконец, мы связываем шейдер с конкретным проходом, как показано ниже:

// Определение Main:
OUTPUT Main(INPUT input){...}

// Компиляция Main:
vertexshader vs = compile vs_2_0 Main();

pass P0
{
     // Устанавливаем vs в качестве
     // вершинного шейдера для данного прохода
     vertexshader = (vs);

     ...

}

Или в более компактной форме:

pass P0
{
     // Устанавливаем вершинный шейдер с точкой входа Main()
     // в качестве вершинного шейдера для данного прохода
     vertexShader = compile vs_2_0 Main();

     ...

}

 

ПРИМЕЧАНИЕ
Следует упомянуть, чтобы вы имели представление об этой возможности, что типы vertexshader и pixelshader можно инициализировать с использованием следующего синтаксиса:
vertexshader vs = asm {
     /* здесь размещаются ассемблерные инструкции */
};

pixelshader  ps = asm {
     /* здесь размещаются ассемблерные инструкции */
};
Этот синтаксис используется если вы пишете свои шейдеры на языке ассемблера.

19.2.4. Строки

Существуют и строковые объекты, которые можно использовать следующим образом:

string filename = "texName.bmp";

Хотя строковые типы не используются в функциях HLSL, они могут быть прочитаны из приложения. Таким образом мы можем поместить в файл эффектов ссылки на файлы данных, которые данный эффект использует, например, имена файлов текстур и X-файлов.

19.2.5. Аннотации

Помимо указания способа использования о котором мы уже говорили, к переменным могут присоединяться аннотации. Аннотации никак не используются в HLSL, но к ним можно получить доступ из приложения через каркас эффектов. Аннотации используются просто для присоединения к переменным «примечаний», которые приложение хотело бы видеть связанными с данной переменной. Добавляются аннотации с использованием синтаксиса <аннотация>, который иллюстрирует следующий фрагмент кода:

texture tex0 < string name = "tiger.bmp"; >;

В данном примере аннотация — это <string name = "tiger.bmp";>. Она связывает с переменной tex0 строку, а именно имя файла, содержащего данные текстуры. Ясно, что добавление к текстуре аннотации с именем соответсвующего файла может оказаться полезным.

Получить аннотации можно с помощью следующего метода:

D3DXHANDLE ID3DXEffect::GetAnnotationByName(
     D3DXHANDLE hObject,
     LPCSTR pName
);

Здесь pName — это имя аннотации для которой мы хотим получить дескриптор, а hObject — это дескриптор родительского блока в котором расположена аннотация, такого как техника, проход или структурный блок. После того, как мы получили дескриптор аннотации, можно получить информацию о ней с помощью метода ID3DXEffect::GetParameterDesc, который заполняет структуру D3DXCONSTANT_DESC. За подробностями обращайтесь к документации DirectX SDK.


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

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