add D3D11 project

This commit is contained in:
2025-11-19 09:43:09 +01:00
parent 9134d2dc40
commit bff01f5adb
36 changed files with 2779 additions and 0 deletions
+94
View File
@@ -0,0 +1,94 @@
#include "Direct3D.h"
#include "Utilities.h"
INT Direct3D::init(HWND hWnd, UINT width, UINT height, BOOL isFullscreen)
{
HRESULT hr = {};
// 1. define swap chain description
DXGI_SWAP_CHAIN_DESC swapChainDesc = {};
swapChainDesc.OutputWindow = hWnd; // target window instance handle
swapChainDesc.Windowed = !isFullscreen; // windowed or fullscreen
swapChainDesc.BufferCount = 1; // amount of backbuffers, minimum 1
swapChainDesc.BufferDesc.Width = width;
swapChainDesc.BufferDesc.Height = height;
swapChainDesc.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; // pixel format, here 4 channels (red, green, blue, alpha) with 8bit depth each and unsigned normalized floating points
swapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; // which technique is used to render to back buffer
swapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_DISCARD; // what happens to front buffer after swap
swapChainDesc.SampleDesc.Count = 1; // have to be at least one
// 2. create Direct3D device, device context & swap chain
D3D_FEATURE_LEVEL featureLevels[] = {
D3D_FEATURE_LEVEL_11_1,
D3D_FEATURE_LEVEL_11_0,
D3D_FEATURE_LEVEL_10_1,
D3D_FEATURE_LEVEL_10_0
};
D3D_FEATURE_LEVEL chosenFeatureLevel = {};
hr = D3D11CreateDeviceAndSwapChain(
nullptr, // graphic card, nullptr -> default adapter
D3D_DRIVER_TYPE_HARDWARE, // rendering with hard- or software renderer
nullptr, // software renderer module reference
0, // optional flags
featureLevels, std::size(featureLevels), // which api features are supported
D3D11_SDK_VERSION, &swapChainDesc, &_pDXGISwapChain, &_pD3DDevice, &chosenFeatureLevel, &_pD3DDeviceContext);
CheckFailed(hr, 20);
// 3. create render target
ID3D11Texture2D* pBackBuffer = nullptr;
hr = _pDXGISwapChain->GetBuffer(0, IID_PPV_ARGS(&pBackBuffer));
CheckFailed(hr, 22);
hr = _pD3DDevice->CreateRenderTargetView(pBackBuffer, nullptr, &_pD3DRenderTargetView);
CheckFailed(hr, 24);
safeRelease(pBackBuffer);
// 4. create depth stencil buffer
// 5. create rasterizer state
//d3d.getDevice()->SetRenderState(D3DRS_LIGHTING, TRUE);
//d3d.getDevice()->SetRenderState(D3DRS_FILLMODE, D3DFILL_SOLID);
//d3d.getDevice()->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
//d3d.getDevice()->SetRenderState(D3DRS_DIFFUSEMATERIALSOURCE, D3DMCS_MATERIAL);
//d3d.getDevice()->SetRenderState(D3DRS_SPECULARMATERIALSOURCE, D3DMCS_MATERIAL);
//d3d.getDevice()->SetRenderState(D3DRS_SPECULARENABLE, TRUE);
// 6. describe viewport
D3D11_VIEWPORT viewport = {};
viewport.TopLeftX = 0.0f;
viewport.TopLeftY = 0.0f;
viewport.Width = width;
viewport.Height = height;
// 7. setup render pipeline (device context)
_pD3DDeviceContext->OMSetRenderTargets(1, &_pD3DRenderTargetView, nullptr);
_pD3DDeviceContext->RSSetViewports(1, &viewport);
return 0;
}
void Direct3D::beginScene(FLOAT r, FLOAT g, FLOAT b)
{
// clear back buffer with a solid color
FLOAT backgroundColor[] = { r, g, b, 1.0f };
_pD3DDeviceContext->ClearRenderTargetView(_pD3DRenderTargetView, backgroundColor);
}
void Direct3D::endScene()
{
_pDXGISwapChain->Present(
0, // sync interval, 0,1,2,3,4 -> (de-)active vsync setting and how often should be synced
0 // optional flags
);
}
void Direct3D::deInit()
{
safeRelease(_pD3DRenderTargetView);
safeRelease(_pDXGISwapChain);
safeRelease(_pD3DDeviceContext);
safeRelease(_pD3DDevice);
}