| 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 | < Назад | Оглавление | Далее > |