netlib.narod.ru | < Назад | Оглавление | Далее > |
Сейчас мы обсудим несколько встроенных объектных типов HLSL. Мы не обсуждали их раньше потому что они используются главным образом в каркасе эффектов.
Встроенный тип HLSL texture представляет объект IDirect3DTexture9. Используя объект texture мы можем связывать текстуру с заданным этапом выборки непосредственно в файле эффекта. У объекта texture есть следующие доступные члены данных:
type — Тип текстуры (т.е., 2D, 3D).
format — Формат пикселей текстуры.
width — Ширина текстуры в пикселях.
height — Высота текстуры в пикселях.
depth — Глубина (для трехмерных объемных текстур) текстуры в пикселях.
Мы обсуждали объекты выборки в главе 18; однако каркас эффектов добавляет новое ключевое слово sampler_state. С помощью ключевого слова sampler_state мы можем инициализировать объект sampler (то есть, устанавливать текстуру и режимы выборки для объекта выборки непосредственно из файла эффкетов). Следующий фрагмент кода иллюстрирует эту возможность:
Texture Tex; sampler S0 = sampler_state { Texture = (Tex); MinFilter = LINEAR; MagFilter = LINEAR; MipFilter = LINEAR; };
Здесь мы связываем текстуру Tex с этапом текстурирования, которому соответствует объект S0, а также задаем режимы выборки для этапа выборки, которому соответствует S0. Все эти параметры мы явно устанавливаем непосредственно из файла эффектов!
Встроенные типы 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 vs = asm { /* здесь размещаются ассемблерные инструкции */ }; pixelshader ps = asm { /* здесь размещаются ассемблерные инструкции */ };Этот синтаксис используется если вы пишете свои шейдеры на языке ассемблера.
Существуют и строковые объекты, которые можно использовать следующим образом:
string filename = "texName.bmp";
Хотя строковые типы не используются в функциях HLSL, они могут быть прочитаны из приложения. Таким образом мы можем поместить в файл эффектов ссылки на файлы данных, которые данный эффект использует, например, имена файлов текстур и X-файлов.
Помимо указания способа использования о котором мы уже говорили, к переменным могут присоединяться аннотации. Аннотации никак не используются в 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 | < Назад | Оглавление | Далее > |