А теперь еще немного теории. Мы уже достаточно близко познакомились с Direct3D, теперь будет легче понять принципы его работы.

Трехмерные тела мы представляем их поверхностью, поверхность же, какой бы сложной она не была, делим на треугольники. Таким образом, почти вся работа (есть исключения) сводится к рисованию треугольников. Треугольники, в свою очередь задаются координатами трех его вершин. Кроме координат, вершины могут содержать и кое-какую другую информацию – цвет, текстурные координаты и т. п., поэтому для задания вершин создана специальная структура, в которую можно записать эти параметры – вертекс. Треугольник очень удобен, любой, применяемый в Direct3D тип проекции, дает в результате тоже треугольник, остается лишь пересчитать параметры его вертексов. В некоторых случаях мы задаем эти параметры сразу в виде, пригодном к выводу на экран без перерасчета, вспомните наши первые проекты (главы 1.3 и 1.4). В других случаях вертексы к этому виду приводятся специальной программой, которая называется «вертексный шейдер».

Определение
Вертексный шейдер – специальная программа, преобразующая координаты и другие характеристики вертексов в вид, пригодный для отображения на плоскость, то есть в «приведенный формат».

Мы уже не раз пользовались вертексным шейдером. Всякий раз, используя флаговое описание вертексов, мы создаем вертексный шейдер. Если при его создании мы применили флаг D3DFVF_XYZRHW – это признак того, что данные вертекса уже представлены в приведенном формате, тогда вертексный шейдер просто определяет перечень характеристик вертекса, подлежащих использованию при растеризации.
Вертексный шейдер, кроме данных самого вертекса, может оперировать довольно большим списком констант. Например, мы можем не задавать цвет в самом вертексе, а использовать материал. Мы создаем и заполняем структуру D3DMATERIAL8, а затем, используя метод SetMaterial, записываем эти данные в соответствующие константы, которые используются вертексным шейдером. Мы рассчитываем матрицы, которые после применения SetTransform тоже попадают в соответствующие константы.