add create vertex buffer for a triangle

This commit is contained in:
2025-09-10 11:27:40 +02:00
parent 417b951112
commit 9a0c9a50ea
7 changed files with 69 additions and 13 deletions
+1
View File
@@ -194,6 +194,7 @@
<ClInclude Include="Mesh.h" /> <ClInclude Include="Mesh.h" />
<ClInclude Include="Time.h" /> <ClInclude Include="Time.h" />
<ClInclude Include="Utilities.h" /> <ClInclude Include="Utilities.h" />
<ClInclude Include="Vertex.h" />
<ClInclude Include="Window.h" /> <ClInclude Include="Window.h" />
</ItemGroup> </ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+3
View File
@@ -68,5 +68,8 @@
<ClInclude Include="Window.h"> <ClInclude Include="Window.h">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="Vertex.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup> </ItemGroup>
</Project> </Project>
+2 -11
View File
@@ -1,6 +1,5 @@
#include "Direct3D.h" #include "Direct3D.h"
#include "Utilities.h" #include "Utilities.h"
#include <random>
INT Direct3D::init(HWND hWnd, UINT width, UINT height, BOOL isFullscreen) INT Direct3D::init(HWND hWnd, UINT width, UINT height, BOOL isFullscreen)
{ {
@@ -49,23 +48,15 @@ INT Direct3D::init(HWND hWnd, UINT width, UINT height, BOOL isFullscreen)
return 0; return 0;
} }
void Direct3D::beginScene() void Direct3D::beginScene(BYTE red, BYTE green, BYTE blue)
{ {
_pD3DDevice->BeginScene(); // init a frame, after this call we are allowed to do draw calls _pD3DDevice->BeginScene(); // init a frame, after this call we are allowed to do draw calls
// change background color // change background color
static std::default_random_engine e;
static std::uniform_int_distribution<int> d(0, 255);
_pD3DDevice->Clear( _pD3DDevice->Clear(
0, nullptr, // areas to clear, null -> everything 0, nullptr, // areas to clear, null -> everything
D3DCLEAR_TARGET, // what to clear, bitmask D3DCLEAR_TARGET, // what to clear, bitmask
D3DCOLOR_XRGB(red, green, blue), 1.0f, 0xFFFFFFFF // how to clean
// how to clean
//D3DCOLOR_XRGB(d(e), d(e), d(e)), //random color
//D3DCOLOR_XRGB(255, 0, 0), // red color
D3DCOLOR_XRGB(0, 0, 0), // black color
1.0f, 0xFFFFFFFF
); );
} }
+1 -1
View File
@@ -7,7 +7,7 @@ class Direct3D
{ {
public: public:
INT init(HWND hWnd, UINT width, UINT height, BOOL isFullscreen); INT init(HWND hWnd, UINT width, UINT height, BOOL isFullscreen);
void beginScene(); void beginScene(BYTE red, BYTE green, BYTE blue);
void endScene(); void endScene();
void deInit(); void deInit();
+39
View File
@@ -1,5 +1,6 @@
#include "Mesh.h" #include "Mesh.h"
#include "Utilities.h" #include "Utilities.h"
#include "Vertex.h"
UINT Mesh::init(IDirect3DDevice9* pD3DDevice) UINT Mesh::init(IDirect3DDevice9* pD3DDevice)
{ {
@@ -20,6 +21,13 @@ void Mesh::update(FLOAT dt)
void Mesh::render(IDirect3DDevice9* pD3DDevice) void Mesh::render(IDirect3DDevice9* pD3DDevice)
{ {
// 1. set mesh data
pD3DDevice->SetStreamSource(0, _pVertexBuffer, 0, _vertexStride);
pD3DDevice->SetFVF(FVF);
// 2. draw call
// vertex buffer only
pD3DDevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, _vertexCount / 3);
} }
void Mesh::deInit() void Mesh::deInit()
@@ -30,6 +38,37 @@ void Mesh::deInit()
UINT Mesh::createVertexBuffer(IDirect3DDevice9* pD3DDevice) UINT Mesh::createVertexBuffer(IDirect3DDevice9* pD3DDevice)
{ {
// 1. define mesh parameters
_vertexCount = 3;
_vertexStride = sizeof(Vertex);
// 2. create vertex buffer object WITHOUT data
HRESULT hr = pD3DDevice->CreateVertexBuffer(
_vertexCount * _vertexStride, // vertex buffer size in bytes
D3DUSAGE_WRITEONLY, // how to access the buffer
FVF, // FVF - Flexible Vertex Format
D3DPOOL_MANAGED, // video memory management
&_pVertexBuffer, // vertex buffer object
nullptr // not used anymore
);
CheckFailed(hr, 300);
// 3. set vertex data
Vertex* pVertices = nullptr;
hr = _pVertexBuffer->Lock(0, 0, reinterpret_cast<void**>(&pVertices), 0); // transfer vertex buffer from video memory to cpu memory
CheckFailed(hr, 310);
// fill vertex buffer with data
pVertices[0] = Vertex(0.0f, 0.5f, 0.0f);
pVertices[1] = Vertex(0.5f, -0.5f, 0.0f);
pVertices[2] = Vertex(-0.5f, -0.5f, 0.0f);
hr = _pVertexBuffer->Unlock(); // transfer vertex buffer back from cpu memory to video memory
CheckFailed(hr, 320);
pVertices = nullptr;
return 0; return 0;
} }
+14
View File
@@ -0,0 +1,14 @@
#pragma once
#include <d3d9.h>
#define FVF D3DFVF_XYZ
struct Vertex
{
FLOAT x;
FLOAT y;
FLOAT z;
Vertex() : x(0.0f), y(0.0f), z(0.0f) {}
Vertex(FLOAT _x, FLOAT _y, FLOAT _z) : x(_x), y(_y), z(_z) {}
};
+9 -1
View File
@@ -1,4 +1,5 @@
#include <Windows.h> #include <Windows.h>
#include <random>
#include "Window.h" #include "Window.h"
#include "Direct3D.h" #include "Direct3D.h"
#include "Mesh.h" #include "Mesh.h"
@@ -19,6 +20,9 @@ int WINAPI WinMain(
const UINT width = 640; const UINT width = 640;
const UINT height = 480; const UINT height = 480;
const BOOL isFullscreen = FALSE; const BOOL isFullscreen = FALSE;
const BYTE red = 255;
const BYTE green = 255;
const BYTE blue = 255;
UINT error = 0; // error code for identifying errors UINT error = 0; // error code for identifying errors
@@ -67,7 +71,11 @@ int WINAPI WinMain(
light.update(time.getDeltaTime()); light.update(time.getDeltaTime());
// 8.2. render objects // 8.2. render objects
d3d.beginScene(); static std::default_random_engine e;
static std::uniform_int_distribution<int> d(0, 255);
//d3d.beginScene(d(e), d(e), d(e)); //random color
d3d.beginScene(red, green, blue);
light.render(d3d.getDevice()); light.render(d3d.getDevice());
material.render(d3d.getDevice()); material.render(d3d.getDevice());