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

       

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


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 { /* здесь размещаются ассемблерные инструкции */ };

Этот синтаксис используется если вы пишете свои шейдеры на языке ассемблера.

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