DirectX 8. Начинаем работу с DirectX Graphics (Ваткин, Dempski) - страница 18

>v[1].x =-0.5f; v[1].y = 0.5f; v[1].z = 0.5f;

>v[2].x = 0.5f; v[2].y = 0.5f; v[2].z = 0.5f;

>//и цвет:

>v[0].Color = D3DCOLOR_XRGB(255,0,0); // красный

>v[1].Color = D3DCOLOR_XRGB(0,255,0); // зеленый

>v[2].Color = D3DCOLOR_XRGB(0,0,255); // синий

Выводом объектов занимаются семейство методов DrawPrimitive интрефейса IDirect3DDevice8. Примитивом здесь называется минимальный объект, который может быть выведен таким методом, например, треугольник здесь тоже является примитивом. В нашем случае мы воспользуемся методом DrawPrimitiveUP():

>pDevice->DrawPrimitiveUP( D3DPT_TRIANGLELIST, 1, v, sizeof(MyVert));

Первым параметром задаётся тип примитивов, второй отвечает за количество примитивов, третий является указателем на область в памяти, где расположена информация о вершинах, в нашем случае мы указываем наш массив, последний параметр — размер шага в байтах, с которым идут вершины одна за другой, у нас элементы массива лежат "плотно", поэтому шагом является размер, занимаемый данными одной вершины, то есть размер структуры MyVert.

Поскольку всё отображение ведется в невидимую часть экрана, мы должны показать все это на экране. Этим занимается метод Present(). Для нашего примера параметры этой функции нас не интересуют, выставляем их в 0:

>pDevice->Present(0, 0, 0, 0);

Этот метод вызывается, когда вы отобразили все объекты, участвующие в текущем кадре, в текущей сцене, то есть после метода EndScene().

В итоге мы построили функцию Render(), которая и будет выводить наш треугольник на экран:

>void Render() {

> // Инициализацию массива v можно вынести за пределы

> // функции Render()

> MyVert v[3];


> v[0].x =-0.5f;  v[0].y =-0.5f;  v[0].z = 0.5f;

> v[1].x =-0.5f;  v[1].y = 0.5f;  v[1].z = 0.5f;

> v[2].x = 0.5f;  v[2].y = 0.5f;  v[2].z = 0.5f;


> v[0].Color = D3DCOLOR_XRGB(255,0,0); // красный

> v[1].Color = D3DCOLOR_XRGB(0,255,0); // зеленый

> v[2].Color = D3DCOLOR_XRGB(0,0,255); // синий


> // Закрашиваем экран синим цветом

> DWORD dwBlue = D3DCOLOR_XRGB(0,0,128);

> pDevice->Clear(0, NULL, D3DCLEAR_TARGET, dwBlue, 1.0f, 0);

> pDevice->BeginScene();

>  // Поскольку мы не используем освещение для треугольника,

>  // отключаем его

>  pDevice->SetRenderState(D3DRS_LIGHTING, FALSE);

>  // Просчет объектов всегда между BeginScene и EndScene

>  pDevice->SetVertexShader(D3DFVF_MYVERT);

>  pDevice->DrawPrimitiveUP(D3DPT_TRIANGLELIST, 1, v, sizeof(MyVert));

> pDevice->EndScene();

> pDevice->Present(0, 0, 0, 0);

>}

Если наше приложение больше ничего не будет выводить на экран, то некоторую часть кода из функции Render() можно вынести за её пределы, а именно, инициализацию массива v, выключение освещения и установку типа просчитываемых вершин.