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

       

Пишем шейдер на HLSL

Мы можем написать код нашего HLSL-шейдера непосредственно в исходном коде приложения в виде длинной строки символов. Однако более удобный и правильный подход— разделить код шейдеров и код приложения. Поэтому мы будем писать наши шейдеры в программе Notepad и сохранять их как обычные текстовые файлы ASCII. Затем для компиляции наших шейдеров мы воспользуемся функцией D3DXCompileShaderFromFile (раздел 16.2.2).

В качестве примера, рассмотрим приведенный ниже простой вершинный шейдер, написанный на HLSL и сохраненный в текстовый файл с именем Transform.txt. Полный код проекта находится в папке с именем Transform, расположенной в сопроводительных файлах к данной главе. Вершинный шейдер преобразует вершину путем применения комбинации матриц вида и проекции а также присваивает рассеиваемой составляющей цвета вершины синий цвет.

ПРИМЕЧАНИЕ

В качестве примера мы здесь рассматриваем вершинный шейдер, но вам пока не надо беспокоиться о том, что должен делать вершинный шейдер, так как этой теме посвящена следующая глава. Сейчас нашей целью является знакомство с синтаксисом и форматом программ на HLSL.

///////////////////////////////////////////////////////////////////// // // Файл: transform.txt // // Автор: Фрэнк Д. Луна (C) All Rights Reserved // // Система: AMD Athlon 1800+ XP, 512 DDR, Geforce 3, Windows XP, // MSVC++ 7.0 // // Описание: Вершинный шейдер, преобразующий вершину с помощью // комбинации матриц преобразования вида и проекции и устанавливающий // для вершины синий цвет // /////////////////////////////////////////////////////////////////////

// // Глобальные переменные //

// Глобальная переменная для хранения комбинации // матриц преобразования вида и проекции. // Мы инициализируем эту переменную в приложении. matrix ViewProjMatrix;

// Инициализация глобального вектора для синего цвета vector Blue = {0.0f, 0.0f, 1.0f, 1.0f};

// // Структуры //

// Входная структура описывает вершины, которые будут // передаваться в шейдер. Здесь входная вершина содержит // только данные о местоположении. struct VS_INPUT { vector position : POSITION; };

// Выходная структура описывает вершину, которая // возвращается шейдером. Здесь выходная вершина // содержит данные о местоположении и цвет struct VS_OUTPUT { vector position : POSITION; vector diffuse : COLOR; };

// // Главная Точка Входа. Обратите внимание, // что функция получает в своем параметре копию // входной вершины и возвращает копию вычисленной // выходной вершины. //

VS_OUTPUT Main(VS_INPUT input) { // Обнуляем данные выходной вершины VS_OUTPUT output = (VS_OUTPUT)0;

// Преобразование пространства вида и проекция output.position = mul(input.position, ViewProjMatrix);

// Делаем рассеиваемую составляющую цвета синей output.diffuse = Blue;

// Возвращаем спроецированную и окрашенную вершину return output; }



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