draw a triangle using fixed-function pipeline

This commit is contained in:
Zack Buhman 2025-12-20 16:19:52 -06:00
parent 18270a2ae9
commit eedf590519

View File

@ -1,10 +1,25 @@
#include <windows.h>
#include <d3d9.h>
#include <stdint.h>
struct CUSTOMVERTEX {
float x, y, z, rhw;
uint32_t color;
};
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW|D3DFVF_DIFFUSE)
const CUSTOMVERTEX vertices[] = {
{ 150.0f, 50.0f, 0.5f, 1.0f, 0xffff0000 },
{ 250.0f, 250.0f, 0.5f, 1.0f, 0xff00ff00 },
{ 50.0f, 250.0f, 0.5f, 1.0f, 0xff00ffff },
};
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
LPDIRECT3D9 g_pD3D = NULL;
LPDIRECT3DDEVICE9 g_pd3dDevice = NULL;
IDirect3D9 * g_pD3D = NULL;
IDirect3DDevice9 * g_pd3dDevice = NULL;
IDirect3DVertexBuffer9 * g_pVB = NULL;
HRESULT InitDirect3D(HWND hwnd)
{
@ -46,9 +61,11 @@ void Render()
g_pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 255), 1.0f, 0);
if (SUCCEEDED(g_pd3dDevice->BeginScene())) {
g_pd3dDevice->EndScene();
}
g_pd3dDevice->BeginScene();
g_pd3dDevice->SetStreamSource(0, g_pVB, 0, (sizeof (CUSTOMVERTEX)));
g_pd3dDevice->SetFVF(D3DFVF_CUSTOMVERTEX);
g_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 1);
g_pd3dDevice->EndScene();
g_pd3dDevice->Present(NULL, NULL, NULL, NULL);
}
@ -83,6 +100,27 @@ int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine
if (!SUCCEEDED(InitDirect3D(hwnd)))
return 0;
HRESULT res;
res = g_pd3dDevice->CreateVertexBuffer(3 * (sizeof (CUSTOMVERTEX)), // length
0, // usage
D3DFVF_CUSTOMVERTEX, // FVF
D3DPOOL_DEFAULT, // Pool
&g_pVB, //ppVertexBuffer
NULL //pSharedHandle
);
if (FAILED(res))
return 0;
void * pVertices;
res = g_pVB->Lock(0, (sizeof (vertices)), &pVertices, 0);
if (FAILED(res))
return 0;
memcpy(pVertices, vertices, (sizeof (vertices)));
g_pVB->Unlock();
ShowWindow(hwnd, nCmdShow);
UpdateWindow(hwnd);
@ -105,7 +143,7 @@ LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
case WM_PAINT:
{
Render();
ValidateRect(hwnd, NULL);
//ValidateRect(hwnd, NULL);
}
return 0;
}