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

       

Пример приложения: мультипликационный эффект


Оба рассмотренных нами к настоящему моменту файла эффектов не используют шейдеры. Поскольку шейдеры обычно являются важной составной частью эффектов, стоит рассмотреть хотя бы один пример их совместного использования. Пример CartoonEffect реализует мультипликационное затенение, которое обсуждалось в главе 17, но на этот раз мы воспользуемся каркасом эффектов. Посмотрите на слегка урезанную версию файла эффекта:

// // Файл: tooneffect.txt // Описание: Мультипликационное затенение в файле эффектов. //

extern matrix WorldMatrix; extern matrix ViewMatrix; extern matrix ProjMatrix; extern vector Color; extern vector LightDirection; static vector Black = {0.0f, 0.0f, 0.0f, 0.0f}; extern texture ShadeTex;

struct VS_INPUT { vector position : POSITION; vector normal : NORMAL; };

struct VS_OUTPUT { vector position : POSITION; float2 uvCoords : TEXCOORD; vector diffuse : COLOR; };

// Шейдер мультипликационного затенения VS_OUTPUT Main(VS_INPUT input) { ...[Код шейдера для краткости пропущен] }

sampler ShadeSampler = sampler_state { Texture = (ShadeTex); MinFilter = POINT; // фильтрация в мультипликационном // затенении отключается MagFilter = POINT; MipFilter = NONE; };

technique Toon { pass P0 { // Устанавливаем вершинный шейдер прохода P0 vertexShader = compile vs_1_1 Main();

// Связываем объект выборки с этапом выборки 0. Sampler[0] = (ShadeSampler); } }

Обратите внимание, что функция шейдера мультипликационного затенения определена в файле эффекта, и мы указываем, какой шейдер будет применяться в данном проходе, с помощью синтаксиса vertexShader = compile vs_1_1 Main(); в блоке прохода. Состояния устройства как обычно устанавливаются в файле эффекта.



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