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

       

Использование данных вершин

Рассмотрим следующее объявление вершины:

D3DVERTEXELEMENT9 decl[] = { {0, 0, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0}, {0, 12, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_NORMAL, 0}, {0, 24, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_NORMAL, 1}, {0, 36, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_NORMAL, 2}, D3DDECL_END() };

Нам необходим способ указать соответствие между элементами объявления вершины и членами данных входной структуры вершинного шейдера. Это соответствие описывается во входной структуре путем указания для каждого члена данных конструкции вида : тип-использования[индекс-использования]. Эта запись идентифицирует элемент объявления вершины по его типу использования и индексу использования. Тот элемент данных вершины, который идентифицирован по указанным параметрам, будет отображен на член данных входной структуры. Например, для приведенного выше примера определение входной структуры может выглядеть так:

struct VS_INPUT { vector position : POSITION; vector normal : NORMAL0; vector faceNormal1 : NORMAL1; vector faceNormal2 : NORMAL2; };

ПРИМЕЧАНИЕ

Если мы не указываем индекс использования, подразумевается, что он равен 0. Таким образом запись POSITION означает то же самое, что и POSITION0.

Здесь элемент 0 в decl, идентифицируемый по типу использования POSITION и индексу использования 0, отображается на элемент входной структуры position. Элемент 1 в decl, идентифицируемый по типу использования NORMAL и индексу использования 0, отображается на элемент входной структуры normal. Элемент 2 в decl, идентифицируемый по типу использования NORMAL и индексу использования 1, отображается на элемент входной структуры faceNormal1. Элемент 3 в decl, идентифицируемый по типу использования NORMAL и индексу использования 2, отображается на элемент входной структуры faceNormal2.

Входная структура вершинного шейдера поддерживает следующие типы использования:

POSITION[n] — Местоположение.

BLENDWEIGHTS[n] — Веса смешивания.

BLENDINDICES[n] — Индексы смешивания.

NORMAL[n] — Вектор нормали.

PSIZE[n] — Размер точки.

DIFFUSE[n] — Рассеиваемый цвет.

SPECULAR[n] — Отражаемый цвет.

TEXCOORD[n] — Координаты текстуры.

TANGENT[n] — Тангенциальный вектор.

BINORMAL[n] — Бинормальный вектор.

TESSFACTOR[n] — Мозаичный коэффициент.

Здесь n — это необязательное целое число в диапазоне [0, 15].

ПРИМЕЧАНИЕ

Еще раз напоминаем, что некоторые типы использования, такие как BLENDWEIGHTS, TANGENT, BINORMAL, BLENDINDICES и TESSFACTOR, в этой книге не рассматриваются.
Кроме того, мы должны указать способ использования каждого члена данных и для выходной структуры. Должен ли член данных интерпретироваться как вектор местоположения, или как цвет, или как координаты текстуры? Видеокарта не знает, пока вы явно не укажете ей это. Синтаксис здесь тот же самый, что и во входной структуре:

struct VS_OUTPUT { vector position : POSITION; vector diffuse : COLOR0; vector specular : COLOR1; };

Выходная структура вершинного шейдера поддерживает следующие типы использования:

POSITION — Местоположение.

PSIZE — Размер точки.

FOG — Значение смешивания тумана.

COLOR[n] — Цвет вершины. Обратите внимание, что можно возвращать несколько значений цветов. Для получения итогового цвета все эти цвета смешиваются вместе.

TEXCOORD[n] — Координтаы текстуры. Обратите внимание, что можно возвращать несколько координат текстуры.

Здесь n — это необязательное целое число в диапазоне [0, 15].


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