Вершина типа R00MVERTEX содержит точку трехмерного пространства и нормаль. При ее обработке конвейер выполнит геометрические преобразования и вычисление цвета вершины. Это показывает еще одно отличие библиотек, так как в OpenGL вершины всегда заданы четырехмерными однородными координатами и подвергаются видовому преобразованию и проецированию.
Предположим, что в файле My3D.h объявлены типы данных SCREENVERTEX, R00MVERTEX и соответствующие им сочетания флагов:
#define D3DFVF_SCREENVERTEX (D3DFVF_XYZRHW|D3DFVFJDIFFUSE) #define D3DFVF_R00MVERTEX (D3DFVF_XYZ|D3DFVF_DIFFUSE)
Тогда функцию рисования треугольников можно реализовать так, как показано в листинге 23.5.
Листинг 23.5
#include <windows.h> //Проект DirectXjninim. файл RenderDX.cpp
#include <d3dx9math.h> //Внутри этого файла есть включение #include <d3d9.h>
#include "My3D.h"
extern LPDIRECT3D9 D3D; //Нужен для создания D3DDevice
extern LPDIRECT3DDEVICE9; // Можно объявить как *IDirect3DDevice9.
//Через этот интерфейс доступны методы рисования.
продолжение &
Применение библиотеки DirectX
Листинг 23.5 (продолжение)
D3DVIEWP0RT9 VP - {0.0. 400.100.0.0.1.Of}; //Размеры области просмотра R00MVERTEX R_vertices[] -{//Массив вершин в пространстве:
{ -O.lf. 0.3f. O.lf. OxffOO}.
{ 0.95f. 0.7f. 0.8f. OxffOO}.
{ -O.lf. 0.7f. O.lf. OxffOO}.
{ 0.25f. O.Of. 0.5f. OxffOO}.
{ 0.8f. 0.2f. 0.5f. OxffOOOO}.
{ 0.5f. l.Of. 0.5f. Oxff}
}:
//В отличие от OpenGL. видимы вершины с 0<Vz <1.0. а не в диапазоне // -1.0<Vz <1.0.
SCREENVERTEX S_vertices[] - //Массив видимых вершин на экранной плоскости {//все (Vx.Vy) в пределах Viewport
{ 25.Of. O.Of. 0.5f. 1. Oxffff}.
{ 80.Of. 20.Of. 0.5f. 1. OxffOOOO}.
{ 50.Of. 100.Of. 0.5f. 1. Oxff}. //В следующем треугольнике всем вершинам присвоен зеленый цвет.
{ 20.Of. 190.Of. O.lf. 1. OxffOO}.
{ 95.Of. 70.Of. 0.8f. 1. D3DCOLOR_COLORVALUE(0.0.1.0.0.0.0.0)}. { 10.Of. 70.Of. O.lf. 1. D3DCOLOR_RGBA(0.255.0.0)}
}:
//Цвет хранится в виде двойного слова (по байту на Alpha.R.G.B). //Чтобы не ошибиться в задании компонентов, лучше использовать //объявленный в d3d9types.h макрос #define D3DC0L0R_ARGB(а.г.g.b)