「C言語/C++/dx11sample2」の編集履歴(バックアップ)一覧はこちら

C言語/C++/dx11sample2 - (2020/07/06 (月) 09:48:51) の1つ前との変更点

追加された行は緑色になります。

削除された行は赤色になります。

|開発環境|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

表示オプション

横に並べて表示:
変化行の前後のみ表示: