まだ案件が決まったわけでは無いので、
ネットでよい記事が無いかを探していたところ、
こちらが見つかりました。
http://dioltista.blogspot.com/2019/04/c-directx11_25.html
#pragma once
#include <windows.h>
class Window
{
public:
HRESULT InitWindow(HINSTANCE hInstance, int nCmdShow);
static HWND GethWnd();
private:
static HWND g_hWnd;
};
#include "Main.h"
#include "DirectX.h"
HWND Window::g_hWnd = nullptr;
//--------------------------------------------------------------------------------------
// 前方宣言
//--------------------------------------------------------------------------------------
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
int WINAPI wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPWSTR lpCmdLine, _In_ int nCmdShow)
{
Window win;
if (FAILED(win.InitWindow(hInstance, nCmdShow)))
return 0;
DirectX11 dx;
if (FAILED(dx.InitDevice()))
return 0;
// メインメッセージループ
MSG msg = { 0 };
while (WM_QUIT != msg.message)
{
if (PeekMessage(&msg, nullptr, 0, 0, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
dx.Render();
}
}
return (int)msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
PAINTSTRUCT ps;
HDC hdc;
switch (message)
{
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
HRESULT Window::InitWindow(HINSTANCE hInstance, int nCmdShow)
{
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = nullptr;
wcex.hCursor = LoadCursor(nullptr, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
wcex.lpszMenuName = nullptr;
wcex.lpszClassName = L"WindowClass";
wcex.hIconSm = nullptr;
if (!RegisterClassEx(&wcex))
return E_FAIL;
RECT rc = { 0, 0, 800, 600 };
AdjustWindowRect(&rc, WS_OVERLAPPEDWINDOW, FALSE);
g_hWnd = CreateWindow(L"WindowClass", L"DirectX11の初期化(クラス化)",
WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX,
CW_USEDEFAULT, CW_USEDEFAULT, rc.right - rc.left, rc.bottom - rc.top, nullptr, nullptr, hInstance,
nullptr);
if (!g_hWnd)
return E_FAIL;
ShowWindow(g_hWnd, nCmdShow);
return S_OK;
}
HWND Window::GethWnd()
{
return g_hWnd;
}
#pragma once
#pragma comment(lib,"d3d11.lib")
#include <d3d11_1.h>
#include <directxcolors.h>
class DirectX11
{
public:
DirectX11();
~DirectX11();
HRESULT InitDevice();
void Render();
private:
ID3D11Device* pd3dDevice;
ID3D11Device1* pd3dDevice1;
ID3D11DeviceContext* pImmediateContext;
ID3D11DeviceContext1* pImmediateContext1;
IDXGISwapChain* pSwapChain;
IDXGISwapChain1* pSwapChain1;
ID3D11RenderTargetView* pRenderTargetView;
};
#include "Main.h"
#include "DirectX.h"
DirectX11::DirectX11()
{
pd3dDevice = nullptr;
pd3dDevice1 = nullptr;
pImmediateContext = nullptr;
pImmediateContext1 = nullptr;
pSwapChain = nullptr;
pSwapChain1 = nullptr;
pRenderTargetView = nullptr;
}
DirectX11::~DirectX11()
{
if (pImmediateContext) pImmediateContext->ClearState();
if (pRenderTargetView) pRenderTargetView->Release();
if (pSwapChain1) pSwapChain1->Release();
if (pSwapChain) pSwapChain->Release();
if (pImmediateContext1) pImmediateContext1->Release();
if (pImmediateContext) pImmediateContext->Release();
if (pd3dDevice1) pd3dDevice1->Release();
if (pd3dDevice) pd3dDevice->Release();
}
HRESULT DirectX11::InitDevice()
{
HRESULT hr = S_OK;
RECT rc;
GetClientRect(Window::GethWnd(), &rc);
UINT width = rc.right - rc.left;
UINT height = rc.bottom - rc.top;
UINT createDeviceFlags = 0;
#ifdef _DEBUG
createDeviceFlags |= D3D11_CREATE_DEVICE_DEBUG;
#endif
D3D_DRIVER_TYPE driverTypes[] =
{
D3D_DRIVER_TYPE_HARDWARE,
D3D_DRIVER_TYPE_WARP,
D3D_DRIVER_TYPE_REFERENCE,
};
UINT numDriverTypes = ARRAYSIZE(driverTypes);
D3D_FEATURE_LEVEL featureLevels[] =
{
D3D_FEATURE_LEVEL_11_1,
D3D_FEATURE_LEVEL_11_0,
D3D_FEATURE_LEVEL_10_1,
D3D_FEATURE_LEVEL_10_0,
};
UINT numFeatureLevels = ARRAYSIZE(featureLevels);
D3D_DRIVER_TYPE g_driverType = D3D_DRIVER_TYPE_NULL;
D3D_FEATURE_LEVEL g_featureLevel = D3D_FEATURE_LEVEL_11_0;
for (UINT driverTypeIndex = 0; driverTypeIndex < numDriverTypes; driverTypeIndex++)
{
g_driverType = driverTypes[driverTypeIndex];
hr = D3D11CreateDevice(nullptr, g_driverType, nullptr, createDeviceFlags, featureLevels, numFeatureLevels,
D3D11_SDK_VERSION, &pd3dDevice, &g_featureLevel, &pImmediateContext);
if (hr == E_INVALIDARG)
{
hr = D3D11CreateDevice(nullptr, g_driverType, nullptr, createDeviceFlags, &featureLevels[1], numFeatureLevels - 1,
D3D11_SDK_VERSION, &pd3dDevice, &g_featureLevel, &pImmediateContext);
}
if (SUCCEEDED(hr))
break;
}
if (FAILED(hr))
return hr;
IDXGIFactory1* dxgiFactory = nullptr;
{
IDXGIDevice* dxgiDevice = nullptr;
hr = pd3dDevice->QueryInterface(__uuidof(IDXGIDevice), reinterpret_cast<void**>(&dxgiDevice));
if (SUCCEEDED(hr))
{
IDXGIAdapter* adapter = nullptr;
hr = dxgiDevice->GetAdapter(&adapter);
if (SUCCEEDED(hr))
{
hr = adapter->GetParent(__uuidof(IDXGIFactory1), reinterpret_cast<void**>(&dxgiFactory));
adapter->Release();
}
dxgiDevice->Release();
}
}
if (FAILED(hr))
return hr;
IDXGIFactory2* dxgiFactory2 = nullptr;
hr = dxgiFactory->QueryInterface(__uuidof(IDXGIFactory2), reinterpret_cast<void**>(&dxgiFactory2));
if (dxgiFactory2)
{
hr = pd3dDevice->QueryInterface(__uuidof(ID3D11Device1), reinterpret_cast<void**>(&pd3dDevice1));
if (SUCCEEDED(hr))
{
(void)pImmediateContext->QueryInterface(__uuidof(ID3D11DeviceContext1), reinterpret_cast<void**>(&pImmediateContext1));
}
DXGI_SWAP_CHAIN_DESC1 sd = {};
sd.Width = width;
sd.Height = height;
sd.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
sd.SampleDesc.Count = 1;
sd.SampleDesc.Quality = 0;
sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
sd.BufferCount = 1;
hr = dxgiFactory2->CreateSwapChainForHwnd(pd3dDevice, Window::GethWnd(), &sd, nullptr, nullptr, &pSwapChain1);
if (SUCCEEDED(hr))
{
hr = pSwapChain1->QueryInterface(__uuidof(IDXGISwapChain), reinterpret_cast<void**>(&pSwapChain));
}
dxgiFactory2->Release();
}
else
{
DXGI_SWAP_CHAIN_DESC sd = {};
sd.BufferCount = 1;
sd.BufferDesc.Width = width;
sd.BufferDesc.Height = height;
sd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
sd.BufferDesc.RefreshRate.Numerator = 60;
sd.BufferDesc.RefreshRate.Denominator = 1;
sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
sd.OutputWindow = Window::GethWnd();
sd.SampleDesc.Count = 1;
sd.SampleDesc.Quality = 0;
sd.Windowed = TRUE;
hr = dxgiFactory->CreateSwapChain(pd3dDevice, &sd, &pSwapChain);
}
dxgiFactory->MakeWindowAssociation(Window::GethWnd(), DXGI_MWA_NO_ALT_ENTER);
dxgiFactory->Release();
if (FAILED(hr))
return hr;
ID3D11Texture2D* pBackBuffer = nullptr;
hr = pSwapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), reinterpret_cast<void**>(&pBackBuffer));
if (FAILED(hr))
return hr;
hr = pd3dDevice->CreateRenderTargetView(pBackBuffer, nullptr, &pRenderTargetView);
pBackBuffer->Release();
if (FAILED(hr))
return hr;
pImmediateContext->OMSetRenderTargets(1, &pRenderTargetView, nullptr);
D3D11_VIEWPORT vp;
vp.Width = (FLOAT)width;
vp.Height = (FLOAT)height;
vp.MinDepth = 0.0f;
vp.MaxDepth = 1.0f;
vp.TopLeftX = 0;
vp.TopLeftY = 0;
pImmediateContext->RSSetViewports(1, &vp);
return S_OK;
}
void DirectX11::Render()
{
pImmediateContext->ClearRenderTargetView(pRenderTargetView, DirectX::Colors::Aquamarine);
pSwapChain->Present(0, 0);
}
今使用しているVisual Studio2022でも動作しました。
とはいえ、やっていることはDirectXを初期化して表示しているだけなので、
ここまではほぼテンプレの処理。
大事なのは、ここに何を書くか、という処理ですね。
「Direct2Dを試す」への1件のフィードバック