>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, выключение освещения и установку типа просчитываемых вершин.