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

       

Точка входа


16.1.3. Точка входа

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

VS_OUTPUT Main(VS_INPUT input) {

ПРИМЕЧАНИЕ

В действительности вы не обязаны использовать входные и выходные структуры. Например, в особенности для пиксельных шейдеров, вы часто будете встречаться с синтаксисом, похожим на приведенный ниже:

float4 Main(in float2 base : TEXCOORD0, in float2 spot : TEXCOORD1, in float2 text : TEXCOORD2) : COLOR { ... }

Параметры передаются в шейдер; в данном примере мы передаем шейдеру три набора координат текстуры. Шейдер возвращает единственное значение цвета, на что указывает констркукия : COLOR следующая за сигнатурой функции. Это определение эквивалентно следующему:

struct INPUT { float2 base : TEXCOORD0; float2 spot : TEXCOORD1; float2 text : TEXCOORD2; };

struct OUTPUT { float4 c : COLOR; };

OUTPUT Main(INPUT input) { ... }

Код функции, являющейся входной точкой, отвечает за вычисление данных возвращаемой вершины на основе полученных данных исходной вершины. Рассматриваемый в примере шейдер просто преобразует координаты вершины в пространство вида и пространство проекции, устанавливает для вершины синий цвет и возвращает полученную в результате вершину. Сперва мы создаем экземпляр выходной структуры VS_OUTPUT и присваиваем всем ее членам 0.

VS_OUTPUT output = (VS_OUTPUT)0; // обнуляем все члены

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

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

Затем мы устанавливаем член данных, задающий рассеиваемую составляющую цвета, равной вектору Blue:

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

И, наконец, мы возвращаем полученную вершину:

return output; }



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