vertex shaded triangle

This commit is contained in:
Zack Buhman 2025-12-21 13:08:16 -06:00
parent eedf590519
commit be143930c8
3 changed files with 123 additions and 14 deletions

View File

@ -14,7 +14,7 @@ CFLAGS += -Wno-error=unused-function
CFLAGS += -Wno-error=unused-variable
CFLAGS += -DUNICODE
LDFLAGS += -Wl,--subsystem,windows -mwindows -mconsole -municode -ld3d9
LDFLAGS += -Wl,--subsystem,windows -mwindows -mconsole -municode -ld3d9 -ld3dx9 -lwinmm
OPT = -Og

112
main.cpp
View File

@ -1,18 +1,19 @@
#include <windows.h>
#include <d3d9.h>
#include <d3dx9.h>
#include <stdint.h>
#include <stdio.h>
struct CUSTOMVERTEX {
float x, y, z, rhw;
struct CUSTOMVERTEX
{
float x, y, z;
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 },
const CUSTOMVERTEX g_Vertices[] = {
{ -1.0f,-1.0f, 0.0f, 0xffff0000, },
{ 1.0f,-1.0f, 0.0f, 0xff0000ff, },
{ 0.0f, 1.0f, 0.0f, 0xffffffff, },
};
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
@ -20,6 +21,9 @@ LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
IDirect3D9 * g_pD3D = NULL;
IDirect3DDevice9 * g_pd3dDevice = NULL;
IDirect3DVertexBuffer9 * g_pVB = NULL;
IDirect3DVertexDeclaration9 * g_pVertexDeclaration = NULL;
ID3DXConstantTable * g_pConstantTable = NULL;
IDirect3DVertexShader9 * g_pVertexShader = NULL;
HRESULT InitDirect3D(HWND hwnd)
{
@ -42,6 +46,9 @@ HRESULT InitDirect3D(HWND hwnd)
return E_FAIL;
}
g_pd3dDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE );
g_pd3dDevice->SetRenderState( D3DRS_LIGHTING, FALSE );
return S_OK;
}
@ -54,16 +61,42 @@ void Cleanup()
g_pD3D->Release();
}
D3DXMATRIX WorldViewProjection()
{
D3DXMATRIX matWorld;
UINT iTime = timeGetTime() % 1000;
FLOAT fAngle = iTime * (2.0f * D3DX_PI) / 1000.0f;
D3DXMatrixRotationY( &matWorld, fAngle );
D3DXVECTOR3 vEyePt( 0.0f, 3.0f,-5.0f );
D3DXVECTOR3 vLookatPt( 0.0f, 0.0f, 0.0f );
D3DXVECTOR3 vUpVec( 0.0f, 1.0f, 0.0f );
D3DXMATRIX matView;
D3DXMatrixLookAtLH( &matView, &vEyePt, &vLookatPt, &vUpVec );
D3DXMATRIX matProj;
D3DXMatrixPerspectiveFovLH( &matProj, D3DX_PI/4, 1.0f, 1.0f, 100.0f );
D3DXMATRIX mWorldViewProj = matWorld * matView * matProj;
return mWorldViewProj;
}
void Render()
{
if (g_pd3dDevice == NULL)
return;
g_pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 255), 1.0f, 0);
g_pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 10, 10), 1.0f, 0);
g_pd3dDevice->BeginScene();
D3DXMATRIX mWorldViewProj = WorldViewProjection();
g_pConstantTable->SetMatrix(g_pd3dDevice, "mWorldViewProj", &mWorldViewProj);
g_pd3dDevice->SetVertexDeclaration(g_pVertexDeclaration);
g_pd3dDevice->SetVertexShader(g_pVertexShader);
g_pd3dDevice->SetStreamSource(0, g_pVB, 0, (sizeof (CUSTOMVERTEX)));
g_pd3dDevice->SetFVF(D3DFVF_CUSTOMVERTEX);
g_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 1);
g_pd3dDevice->EndScene();
@ -102,9 +135,13 @@ int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine
HRESULT res;
//////////////////////////////////////////////////////////////////////
// vertex buffer
//////////////////////////////////////////////////////////////////////
res = g_pd3dDevice->CreateVertexBuffer(3 * (sizeof (CUSTOMVERTEX)), // length
0, // usage
D3DFVF_CUSTOMVERTEX, // FVF
0,//D3DFVF_CUSTOMVERTEX, // FVF
D3DPOOL_DEFAULT, // Pool
&g_pVB, //ppVertexBuffer
NULL //pSharedHandle
@ -113,14 +150,63 @@ int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine
return 0;
void * pVertices;
res = g_pVB->Lock(0, (sizeof (vertices)), &pVertices, 0);
res = g_pVB->Lock(0, (sizeof (g_Vertices)), &pVertices, 0);
if (FAILED(res))
return 0;
memcpy(pVertices, vertices, (sizeof (vertices)));
memcpy(pVertices, g_Vertices, (sizeof (g_Vertices)));
g_pVB->Unlock();
//////////////////////////////////////////////////////////////////////
// vertex declaration
//////////////////////////////////////////////////////////////////////
const D3DVERTEXELEMENT9 decl[] = {
{ 0, 0, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0 },
{ 0, 12, D3DDECLTYPE_D3DCOLOR, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_COLOR, 0 },
D3DDECL_END()
};
res = g_pd3dDevice->CreateVertexDeclaration(decl, &g_pVertexDeclaration);
if (FAILED(res))
return 0;
//////////////////////////////////////////////////////////////////////
// vertex shader
//////////////////////////////////////////////////////////////////////
LPD3DXBUFFER pCode;
DWORD dwShaderFlags = 0;
res = D3DXCompileShaderFromFile(L"main.vsh", // pSrcFile
NULL, // pDefines
NULL, // pInclude
"Main", // pFunctionName
"vs_3_0", // pProfile
dwShaderFlags, // Flags
&pCode, // ppShader
NULL, // ppErrorMsgs
&g_pConstantTable // ppConstantTable
);
if (FAILED(res)) {
fprintf(stderr, "D3DXCompileShader\n");
return 0;
}
res = g_pd3dDevice->CreateVertexShader((DWORD*)pCode->GetBufferPointer(), &g_pVertexShader);
pCode->Release();
if(FAILED(res)) {
fprintf(stderr, "CreateVertexShader\n");
return 0;
}
//
fprintf(stderr, "success\n");
fflush(stderr);
ShowWindow(hwnd, nCmdShow);
UpdateWindow(hwnd);

23
main.vsh Normal file
View File

@ -0,0 +1,23 @@
struct VS_INPUT
{
float3 Position : POSITION;
float4 Color : COLOR0;
};
struct VS_OUTPUT
{
float4 Position : POSITION; // vertex position
float4 Diffuse : COLOR0; // vertex diffuse color
};
float4x4 mWorldViewProj;
VS_OUTPUT Main(VS_INPUT Input)
{
VS_OUTPUT Output;
Output.Position = mul(float4(Input.Position, 1.0), mWorldViewProj);
Output.Diffuse = Input.Color;
return Output;
}