Объекты вершинных и пиксельных шейдеров
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 vs = asm { /* здесь размещаются ассемблерные инструкции */ };
pixelshader ps = asm { /* здесь размещаются ассемблерные инструкции */ };
Этот синтаксис используется если вы пишете свои шейдеры на языке ассемблера.