Раз мы взялись за MFC, то и дальше пойдем по этому пути. Остановите фон, чтобы он не моргал, см. "Шаг 4 - Рисуем треугольник", установив его в черный цвет.
p_d3d_Device->Clear (0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB (0, 0, 0), 0.0f, 0);
Далее после всех #include расположим:
#define D3DFVF_CUSTOMVERTEX ( D3DFVF_XYZRHW | D3DFVF_DIFFUSE ) struct CUSTOMVERTEX { FLOAT x, y, z, rhw; DWORD color; };
В класс главного окна (CMainWnd) в private добавим:
LPDIRECT3DVERTEXBUFFER8 p_VertexBuffer; // наш буфер вершин
В конструктор главного окна CMainWnd::CMainWnd() нужно добавить в самое начало:
p_VertexBuffer = NULL;
И, конечно, этот указатель удалить перед закрытием окна, добавьте его в самое начало деструктора:
CMainWnd::~CMainWnd(void) { _RELEASE_(p_VertexBuffer); _DELETE_(p_VertexBuffer); _RELEASE_(p_d3d_Device); _DELETE_(p_d3d_Device); _RELEASE_(p_d3d); _DELETE_(p_d3d); }
Добавляем в конструктор перед созданием главного окна приложения:
CUSTOMVERTEX g_Vertices[] = { { 60.0f, 60.0f, 0.5f, 1.0f, 0xffff0000, }, { 200.0f, 60.0f, 0.5f, 1.0f, 0xff00ff00, }, { 60.0f, 200.0f, 0.5f, 1.0f, 0xff0000ff, }, };
И после создания устройства Direct3D:
p_d3d_Device->CreateVertexBuffer (3*sizeof(CUSTOMVERTEX), 0, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, &p_VertexBuffer); VOID* pVertices; p_VertexBuffer->Lock (0, sizeof(g_Vertices), (BYTE**)&pVertices, 0); memcpy (pVertices, g_Vertices, sizeof(g_Vertices)); p_VertexBuffer->Unlock();
Переходим в функцию OnPaint() и между строками BeginScene() и EndScene() добавляем:
p_d3d_Device->SetVertexShader (D3DFVF_CUSTOMVERTEX); p_d3d_Device->SetStreamSource (0, p_VertexBuffer, sizeof(CUSTOMVERTEX)); p_d3d_Device->DrawPrimitive (D3DPT_TRIANGLELIST, 0, 1);
Для более подробной информации смотрите "Шаг 4 - Рисуем треугольник".
Чтобы устройства не терялись при нажатий клавиш Alt+TAB, добавьте в OnPaint() в самое начало:
HRESULT hr; hr=p_d3d_Device->TestCooperativeLevel(); if(hr==D3DERR_DEVICELOST) return; if(hr==D3DERR_DEVICENOTRESET) p_d3d_Device->Reset(&d3dpp);
D3DPOOL_DEFAULT замените на D3DPOOL_MANAGED в конструкторе окна при создании буфера вершин CreateVertexBuffer, более подробно см. "Шаг 8 - Потеря устройств при нажатии клавиш Alt+TAB". А также
D3DPRESENT_PARAMETERS d3dpp;
перенесите в класс CMainWnd, чтобы все могли иметь к нему доступ внутри класса (private).
Запускаем, смотрим, пока ничего нового, но зато при помощи MFC :)