「C言語/C++/dx11sample2」の編集履歴(バックアップ)一覧はこちら
追加された行は緑色になります。
削除された行は赤色になります。
|開発環境|Microsoft Visual Studio Community 2019|
|実行環境|Microsoft Windows 10 Home (64bit)|
|プロジェクト テンプレート|C++ 空のプロジェクト|
|プロジェクト名|dx11sample2|
#image(dx11sample2.jpg)
dx11sample2.cpp
#highlight(c++){{
#pragma comment(lib, "d3d11")
#pragma comment(lib, "d3dcompiler")
#include <Windows.h>
#include <wrl.h>
#include <d3d11.h>
#include <d3dcompiler.h>
#include <DirectXMath.h>
#define HLSL_FILE L"dx11sample2.fx"
using namespace Microsoft::WRL;
using namespace DirectX;
struct ConstantBuffer {
float frame;
float f1, f2, f3; // filler
};
// 外部変数
ComPtr<ID3D11Device> g_pDevice;
ComPtr<ID3D11DeviceContext> g_pContext;
ComPtr<IDXGISwapChain> g_pSwapChain;
ComPtr<ID3D11RenderTargetView> g_pRenderTargetView;
ComPtr<ID3D11VertexShader> g_pVertexShader;
ComPtr<ID3D11PixelShader> g_pPixelShader;
ComPtr<ID3D11Buffer> g_pConstantBuffer;
float g_frame = 0;
// 関数宣言
HWND InitWindow(HINSTANCE hInst);
HRESULT InitDevice(HWND hWnd);
void CleanupDevice();
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
void Render();
int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE, LPWSTR, int nCmdShow)
{
HWND hWnd = InitWindow(hInstance);
if (!hWnd) return -1;
if (FAILED(InitDevice(hWnd))) {
CleanupDevice();
return -1;
}
ShowWindow(hWnd, nCmdShow);
MSG msg = { 0 };
while (msg.message != WM_QUIT) {
if (PeekMessage(&msg, nullptr, 0, 0, PM_REMOVE)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else {
Render();
}
}
CleanupDevice();
return int(msg.wParam);
}
HWND InitWindow(HINSTANCE hInst)
{
WNDCLASSEX wc = { sizeof WNDCLASSEX };
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = WndProc;
wc.hInstance = hInst;
wc.hCursor = LoadCursor(nullptr, IDC_ARROW);
wc.hbrBackground = HBRUSH(COLOR_WINDOW + 1);
wc.lpszClassName = L"dx11sample2";
if (!RegisterClassEx(&wc)) return nullptr;
DWORD dwStyle = WS_OVERLAPPEDWINDOW;
RECT rc = { 0, 0, 400, 400 };
AdjustWindowRect(&rc, dwStyle, FALSE);
HWND hWnd = CreateWindow(
wc.lpszClassName, L"dx11sample2", dwStyle,
CW_USEDEFAULT, 0, rc.right - rc.left, rc.bottom - rc.top,
nullptr, nullptr, hInst, nullptr);
return hWnd;
}
HRESULT CompileShaderFromFile(
LPCWSTR szFileName, LPCSTR szEntryPoint, LPCSTR szShaderModel, ID3DBlob** ppBlobOut)
{
DWORD dwShaderFlags = D3DCOMPILE_ENABLE_STRICTNESS;
ComPtr<ID3DBlob> pErrorBlob;
HRESULT hr = D3DCompileFromFile(szFileName, nullptr, nullptr, szEntryPoint, szShaderModel,
dwShaderFlags, 0, ppBlobOut, &pErrorBlob);
if (FAILED(hr)) {
if (pErrorBlob) {
OutputDebugStringA((LPCSTR)pErrorBlob->GetBufferPointer());
}
return hr;
}
return S_OK;
}
HRESULT InitDevice(HWND hWnd)
{
HRESULT hr;
RECT rc;
GetClientRect(hWnd, &rc);
UINT width = rc.right - rc.left;
UINT height = rc.bottom - rc.top;
DXGI_SWAP_CHAIN_DESC sd = { 0 };
sd.BufferDesc.Width = width;
sd.BufferDesc.Height = height;
sd.BufferDesc.RefreshRate.Numerator = 60;
sd.BufferDesc.RefreshRate.Denominator = 1;
sd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; // 符号なし正規化整数
sd.SampleDesc.Count = 1;
sd.SampleDesc.Quality = 0;
sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
sd.BufferCount = 1;
sd.OutputWindow = hWnd;
sd.Windowed = TRUE;
sd.SwapEffect = DXGI_SWAP_EFFECT_DISCARD;
D3D_FEATURE_LEVEL featureLevel;
hr = D3D11CreateDeviceAndSwapChain(
nullptr, D3D_DRIVER_TYPE_HARDWARE, nullptr, 0, nullptr, 0, D3D11_SDK_VERSION, &sd,
&g_pSwapChain, &g_pDevice, &featureLevel, &g_pContext);
if (FAILED(hr)) return hr;
// レンダーターゲットビュー
ComPtr<ID3D11Texture2D> pBackBuffer;
hr = g_pSwapChain->GetBuffer(0, IID_PPV_ARGS(&pBackBuffer));
if (FAILED(hr)) return hr;
hr = g_pDevice->CreateRenderTargetView(pBackBuffer.Get(), nullptr, &g_pRenderTargetView);
if (FAILED(hr)) return hr;
g_pContext->OMSetRenderTargets(1, g_pRenderTargetView.GetAddressOf(), nullptr);
// ビューポート
D3D11_VIEWPORT vp = { 0 };
vp.Width = (FLOAT)width;
vp.Height = (FLOAT)height;
vp.MinDepth = 0;
vp.MaxDepth = 1;
g_pContext->RSSetViewports(1, &vp);
// 頂点シェーダ
ComPtr<ID3DBlob> pVSBlob;
hr = CompileShaderFromFile(HLSL_FILE, "VS", "vs_5_0", &pVSBlob);
if (FAILED(hr)) {
return hr;
}
hr = g_pDevice->CreateVertexShader(
pVSBlob->GetBufferPointer(), pVSBlob->GetBufferSize(), nullptr, &g_pVertexShader);
if (FAILED(hr)) return hr;
// ピクセルシェーダ
ComPtr<ID3DBlob> pPSBlob;
hr = CompileShaderFromFile(HLSL_FILE, "PS", "ps_5_0", &pPSBlob);
if (FAILED(hr)) {
return hr;
}
hr = g_pDevice->CreatePixelShader(
pPSBlob->GetBufferPointer(), pPSBlob->GetBufferSize(), nullptr, &g_pPixelShader);
if (FAILED(hr)) return hr;
// 定数バッファ
D3D11_BUFFER_DESC cb = { 0 };
cb.ByteWidth = sizeof ConstantBuffer;
cb.Usage = D3D11_USAGE_DEFAULT;
cb.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
hr = g_pDevice->CreateBuffer(&cb, nullptr, &g_pConstantBuffer);
if (FAILED(hr)) return hr;
return S_OK;
}
void CleanupDevice()
{
if (g_pContext) {
g_pContext->ClearState();
}
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
PAINTSTRUCT ps;
HDC hdc;
switch (uMsg) {
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
return 0;
}
void Render()
{
float ClearColor[4] = { 0, 0, 0, 1 };
g_pContext->ClearRenderTargetView(g_pRenderTargetView.Get(), ClearColor);
ConstantBuffer cb;
cb.frame = g_frame;
g_pContext->UpdateSubresource(g_pConstantBuffer.Get(), 0, nullptr, &cb, 0, 0);
g_pContext->VSSetShader(g_pVertexShader.Get(), nullptr, 0);
g_pContext->VSSetConstantBuffers(0, 1, g_pConstantBuffer.GetAddressOf());
g_pContext->PSSetShader(g_pPixelShader.Get(), nullptr, 0);
// dx11sample2.fx
g_pContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
g_pContext->Draw(3, 0);
// dx11sample2b.fx
//g_pContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP);
//g_pContext->Draw(18, 0);
g_pSwapChain->Present(1, 0);
//
g_frame++;
}
}}
dx11sample2.fx
#highlight(txt){{
cbuffer ConstantBuffer : register(b0)
{
float frame;
};
struct VS_INPUT
{
uint vid : SV_VertexID;
};
struct PS_INPUT
{
float4 Pos : SV_Position;
float4 Color : COLOR;
};
// Vertex Shader
PS_INPUT VS(VS_INPUT input)
{
PS_INPUT output = (PS_INPUT)0;
float2 coord = float2((input.vid >> 1) & 1, input.vid & 1);
float2 pos = coord - 0.5;
float rad = radians(frame);
float c = cos(rad);
float s = sin(rad);
pos = float2(pos.x * c - pos.y * s, pos.x * s + pos.y * c);
output.Pos = float4(pos, 0, 1);
output.Color = float4(coord, 1, 1);
return output;
}
// Pixel Shader
float4 PS(PS_INPUT input) : SV_Target
{
return input.Color;
}
}}
dx11sample2b.fx
#region
#highlight(txt){{
cbuffer ConstantBuffer : register(b0)
{
float frame;
};
struct VS_INPUT
{
uint vid : SV_VertexID;
};
struct PS_INPUT
{
float4 Pos : SV_Position;
float4 Coord : TEXCOORD;
};
matrix rotationX(float angle)
{
float c = cos(angle);
float s = sin(angle);
return matrix(
1, 0, 0, 0,
0, c, -s, 0,
0, s, c, 0,
0, 0, 0, 1);
}
matrix rotationY(float angle)
{
float c = cos(angle);
float s = sin(angle);
return matrix(
c, 0, s, 0,
0, 1, 0, 0,
-s, 0, c, 0,
0, 0, 0, 1);
}
matrix rotationZ(float angle)
{
float c = cos(angle);
float s = sin(angle);
return matrix(
c, -s, 0, 0,
s, c, 0, 0,
0, 0, 1, 0,
0, 0, 0, 1);
}
static uint vertices[] = { 3,1,2,0, 0,4,2,6,3,7,1,5,0,4, 4,5,6,7 };
// Vertex Shader
PS_INPUT VS(VS_INPUT input)
{
PS_INPUT output = (PS_INPUT)0;
uint vtx = vertices[input.vid];
float3 coord = float3(vtx & 1, (vtx >> 1) & 1, (vtx >> 2) & 1);
float4 pos = float4((coord - 0.5) * float3(0.4, 0.8, 0.2), 1);
matrix mWorld = mul(rotationY(radians(frame)), rotationX(radians(70.0)));
output.Pos = mul(mWorld, pos);
output.Pos.z += 0.5;
output.Coord = float4(coord, 1);
return output;
}
// Pixel Shader
float4 PS(PS_INPUT input) : SV_Target
{
float3 edge = step(0.48, abs(input.Coord.xyz - 0.5));
if (length(edge) > 1.0) {
return float4(0.5, 0.5, 0.5, 1);
}
return input.Coord;
}
}}
#endregion
|開発環境|Microsoft Visual Studio Community 2019|
|実行環境|Microsoft Windows 10 Home (64bit)|
|プロジェクト テンプレート|C++ 空のプロジェクト|
|プロジェクト名|dx11sample2|
#image(dx11sample2.jpg)
#image(dx11sample2b.jpg)
dx11sample2.cpp
#highlight(c++){{
#pragma comment(lib, "d3d11")
#pragma comment(lib, "d3dcompiler")
#include <Windows.h>
#include <wrl.h>
#include <d3d11.h>
#include <d3dcompiler.h>
#include <DirectXMath.h>
#define HLSL_FILE L"dx11sample2.fx"
using namespace Microsoft::WRL;
using namespace DirectX;
struct ConstantBuffer {
float frame;
float f1, f2, f3; // filler
};
// 外部変数
ComPtr<ID3D11Device> g_pDevice;
ComPtr<ID3D11DeviceContext> g_pContext;
ComPtr<IDXGISwapChain> g_pSwapChain;
ComPtr<ID3D11RenderTargetView> g_pRenderTargetView;
ComPtr<ID3D11VertexShader> g_pVertexShader;
ComPtr<ID3D11PixelShader> g_pPixelShader;
ComPtr<ID3D11Buffer> g_pConstantBuffer;
float g_frame = 0;
// 関数宣言
HWND InitWindow(HINSTANCE hInst);
HRESULT InitDevice(HWND hWnd);
void CleanupDevice();
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
void Render();
int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE, LPWSTR, int nCmdShow)
{
HWND hWnd = InitWindow(hInstance);
if (!hWnd) return -1;
if (FAILED(InitDevice(hWnd))) {
CleanupDevice();
return -1;
}
ShowWindow(hWnd, nCmdShow);
MSG msg = { 0 };
while (msg.message != WM_QUIT) {
if (PeekMessage(&msg, nullptr, 0, 0, PM_REMOVE)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else {
Render();
}
}
CleanupDevice();
return int(msg.wParam);
}
HWND InitWindow(HINSTANCE hInst)
{
WNDCLASSEX wc = { sizeof WNDCLASSEX };
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = WndProc;
wc.hInstance = hInst;
wc.hCursor = LoadCursor(nullptr, IDC_ARROW);
wc.hbrBackground = HBRUSH(COLOR_WINDOW + 1);
wc.lpszClassName = L"dx11sample2";
if (!RegisterClassEx(&wc)) return nullptr;
DWORD dwStyle = WS_OVERLAPPEDWINDOW;
RECT rc = { 0, 0, 400, 400 };
AdjustWindowRect(&rc, dwStyle, FALSE);
HWND hWnd = CreateWindow(
wc.lpszClassName, L"dx11sample2", dwStyle,
CW_USEDEFAULT, 0, rc.right - rc.left, rc.bottom - rc.top,
nullptr, nullptr, hInst, nullptr);
return hWnd;
}
HRESULT CompileShaderFromFile(
LPCWSTR szFileName, LPCSTR szEntryPoint, LPCSTR szShaderModel, ID3DBlob** ppBlobOut)
{
DWORD dwShaderFlags = D3DCOMPILE_ENABLE_STRICTNESS;
ComPtr<ID3DBlob> pErrorBlob;
HRESULT hr = D3DCompileFromFile(szFileName, nullptr, nullptr, szEntryPoint, szShaderModel,
dwShaderFlags, 0, ppBlobOut, &pErrorBlob);
if (FAILED(hr)) {
if (pErrorBlob) {
OutputDebugStringA((LPCSTR)pErrorBlob->GetBufferPointer());
}
return hr;
}
return S_OK;
}
HRESULT InitDevice(HWND hWnd)
{
HRESULT hr;
RECT rc;
GetClientRect(hWnd, &rc);
UINT width = rc.right - rc.left;
UINT height = rc.bottom - rc.top;
DXGI_SWAP_CHAIN_DESC sd = { 0 };
sd.BufferDesc.Width = width;
sd.BufferDesc.Height = height;
sd.BufferDesc.RefreshRate.Numerator = 60;
sd.BufferDesc.RefreshRate.Denominator = 1;
sd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; // 符号なし正規化整数
sd.SampleDesc.Count = 1;
sd.SampleDesc.Quality = 0;
sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
sd.BufferCount = 1;
sd.OutputWindow = hWnd;
sd.Windowed = TRUE;
sd.SwapEffect = DXGI_SWAP_EFFECT_DISCARD;
D3D_FEATURE_LEVEL featureLevel;
hr = D3D11CreateDeviceAndSwapChain(
nullptr, D3D_DRIVER_TYPE_HARDWARE, nullptr, 0, nullptr, 0, D3D11_SDK_VERSION, &sd,
&g_pSwapChain, &g_pDevice, &featureLevel, &g_pContext);
if (FAILED(hr)) return hr;
// レンダーターゲットビュー
ComPtr<ID3D11Texture2D> pBackBuffer;
hr = g_pSwapChain->GetBuffer(0, IID_PPV_ARGS(&pBackBuffer));
if (FAILED(hr)) return hr;
hr = g_pDevice->CreateRenderTargetView(pBackBuffer.Get(), nullptr, &g_pRenderTargetView);
if (FAILED(hr)) return hr;
g_pContext->OMSetRenderTargets(1, g_pRenderTargetView.GetAddressOf(), nullptr);
// ビューポート
D3D11_VIEWPORT vp = { 0 };
vp.Width = (FLOAT)width;
vp.Height = (FLOAT)height;
vp.MinDepth = 0;
vp.MaxDepth = 1;
g_pContext->RSSetViewports(1, &vp);
// 頂点シェーダ
ComPtr<ID3DBlob> pVSBlob;
hr = CompileShaderFromFile(HLSL_FILE, "VS", "vs_5_0", &pVSBlob);
if (FAILED(hr)) {
return hr;
}
hr = g_pDevice->CreateVertexShader(
pVSBlob->GetBufferPointer(), pVSBlob->GetBufferSize(), nullptr, &g_pVertexShader);
if (FAILED(hr)) return hr;
// ピクセルシェーダ
ComPtr<ID3DBlob> pPSBlob;
hr = CompileShaderFromFile(HLSL_FILE, "PS", "ps_5_0", &pPSBlob);
if (FAILED(hr)) {
return hr;
}
hr = g_pDevice->CreatePixelShader(
pPSBlob->GetBufferPointer(), pPSBlob->GetBufferSize(), nullptr, &g_pPixelShader);
if (FAILED(hr)) return hr;
// 定数バッファ
D3D11_BUFFER_DESC cb = { 0 };
cb.ByteWidth = sizeof ConstantBuffer;
cb.Usage = D3D11_USAGE_DEFAULT;
cb.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
hr = g_pDevice->CreateBuffer(&cb, nullptr, &g_pConstantBuffer);
if (FAILED(hr)) return hr;
return S_OK;
}
void CleanupDevice()
{
if (g_pContext) {
g_pContext->ClearState();
}
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
PAINTSTRUCT ps;
HDC hdc;
switch (uMsg) {
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
return 0;
}
void Render()
{
float ClearColor[4] = { 0, 0, 0, 1 };
g_pContext->ClearRenderTargetView(g_pRenderTargetView.Get(), ClearColor);
ConstantBuffer cb;
cb.frame = g_frame;
g_pContext->UpdateSubresource(g_pConstantBuffer.Get(), 0, nullptr, &cb, 0, 0);
g_pContext->VSSetShader(g_pVertexShader.Get(), nullptr, 0);
g_pContext->VSSetConstantBuffers(0, 1, g_pConstantBuffer.GetAddressOf());
g_pContext->PSSetShader(g_pPixelShader.Get(), nullptr, 0);
// dx11sample2.fx
g_pContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
g_pContext->Draw(3, 0);
// dx11sample2b.fx
//g_pContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP);
//g_pContext->Draw(18, 0);
g_pSwapChain->Present(1, 0);
//
g_frame++;
}
}}
dx11sample2.fx
#highlight(txt){{
cbuffer ConstantBuffer : register(b0)
{
float frame;
};
struct VS_INPUT
{
uint vid : SV_VertexID;
};
struct PS_INPUT
{
float4 Pos : SV_Position;
float4 Color : COLOR;
};
// Vertex Shader
PS_INPUT VS(VS_INPUT input)
{
PS_INPUT output = (PS_INPUT)0;
float2 coord = float2((input.vid >> 1) & 1, input.vid & 1);
float2 pos = coord - 0.5;
float rad = radians(frame);
float c = cos(rad);
float s = sin(rad);
pos = float2(pos.x * c - pos.y * s, pos.x * s + pos.y * c);
output.Pos = float4(pos, 0, 1);
output.Color = float4(coord, 1, 1);
return output;
}
// Pixel Shader
float4 PS(PS_INPUT input) : SV_Target
{
return input.Color;
}
}}
dx11sample2b.fx
#region
#highlight(txt){{
cbuffer ConstantBuffer : register(b0)
{
float frame;
};
struct VS_INPUT
{
uint vid : SV_VertexID;
};
struct PS_INPUT
{
float4 Pos : SV_Position;
float4 Coord : TEXCOORD;
};
matrix rotationX(float angle)
{
float c = cos(angle);
float s = sin(angle);
return matrix(
1, 0, 0, 0,
0, c, -s, 0,
0, s, c, 0,
0, 0, 0, 1);
}
matrix rotationY(float angle)
{
float c = cos(angle);
float s = sin(angle);
return matrix(
c, 0, s, 0,
0, 1, 0, 0,
-s, 0, c, 0,
0, 0, 0, 1);
}
matrix rotationZ(float angle)
{
float c = cos(angle);
float s = sin(angle);
return matrix(
c, -s, 0, 0,
s, c, 0, 0,
0, 0, 1, 0,
0, 0, 0, 1);
}
static uint vertices[] = { 3,1,2,0, 0,4,2,6,3,7,1,5,0,4, 4,5,6,7 };
// Vertex Shader
PS_INPUT VS(VS_INPUT input)
{
PS_INPUT output = (PS_INPUT)0;
uint vtx = vertices[input.vid];
float3 coord = float3(vtx & 1, (vtx >> 1) & 1, (vtx >> 2) & 1);
float4 pos = float4((coord - 0.5) * float3(0.4, 0.8, 0.2), 1);
matrix mWorld = mul(rotationY(radians(frame)), rotationX(radians(70.0)));
output.Pos = mul(mWorld, pos);
output.Pos.z += 0.5;
output.Coord = float4(coord, 1);
return output;
}
// Pixel Shader
float4 PS(PS_INPUT input) : SV_Target
{
float3 edge = step(0.48, abs(input.Coord.xyz - 0.5));
if (length(edge) > 1.0) {
return float4(0.5, 0.5, 0.5, 1);
}
return input.Coord;
}
}}
#endregion