Commit d86a04d1 authored by Administrator's avatar Administrator
Browse files

Re-structure code

parent 732beb28
......@@ -4,12 +4,10 @@
#include <d3d11.h>
#pragma comment (lib, "d3d11.lib")
#include <d3dcompiler.h>
#pragma comment (lib, "d3dcompiler.lib")
#include <wrl.h>
#include <DirectXMath.h>
namespace dx = DirectX;
......@@ -19,20 +17,36 @@ namespace dx = DirectX;
#include "Timer.h" // to use timer
Timer timer;
/************************************
* 1.1 CreateDeviceAndSwapChain
************************************/
// global declarations
Microsoft::WRL::ComPtr<IDXGISwapChain> swapchain; // the pointer to the swap chain interface
Microsoft::WRL::ComPtr<ID3D11Device> dev; // the pointer to our Direct3D device interface
Microsoft::WRL::ComPtr<ID3D11DeviceContext> devcon; // the pointer to our Direct3D device context
/************************************
* 1.2 DefineRenderTargetView
************************************/
Microsoft::WRL::ComPtr<ID3D11Texture2D> pBackBuffer;
// 定义Targe View
Microsoft::WRL::ComPtr<ID3D11RenderTargetView> targetView;
// Define Shader
Microsoft::WRL::ComPtr<ID3D11PixelShader> pPixelShader;
Microsoft::WRL::ComPtr<ID3DBlob> pCompiledPixelBlob;
Microsoft::WRL::ComPtr<ID3D11VertexShader> pVertexShader;
Microsoft::WRL::ComPtr<ID3DBlob> pCompiledVertexBlob;
/************************************
* 1.3 DefineDepthStencilView
************************************/
// Define depth stencil buffer
Microsoft::WRL::ComPtr<ID3D11DepthStencilState> pDepthStencilState;
// Define depth stencil texture
Microsoft::WRL::ComPtr<ID3D11Texture2D> depthStencilTexture;
// Define depth stencil view
Microsoft::WRL::ComPtr<ID3D11DepthStencilView> pDSView;
/************************************
* 2.3 DefineVertexBuffer
************************************/
// Define vertex buffer
Microsoft::WRL::ComPtr<ID3D11Buffer> pVertexBuffer;
// Create buffer description
......@@ -68,6 +82,9 @@ const Vertex vertices[] =
{ 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f },
};
/************************************
* 2.4 DefineIndexBuffer
************************************/
// Define index buffer
Microsoft::WRL::ComPtr<ID3D11Buffer> pIndexBuffer;
// Create index buffer
......@@ -87,17 +104,20 @@ const unsigned short indices[] =
0, 1, 4, 1, 5, 4,
};
// Define constant buffer
Microsoft::WRL::ComPtr<ID3D11Buffer> pConstantBuffer;
// Create constant buffer struct
struct ConstantBuffer
/************************************
* 2.5 DefineTransConstBuffer
************************************/
// Define transformation constant buffer
Microsoft::WRL::ComPtr<ID3D11Buffer> pTransConstBuffer;
// Create transformation constant buffer struct
struct TransConstBuffer
{
dx::XMMATRIX transform;
};
// create constant buffer
const float heightWidthRatio = 0.3f / 0.4f;
float angle = 0.0f;
ConstantBuffer cb =
TransConstBuffer tcb =
{
// transpose the matrix to change from row_major to column_major
dx::XMMatrixTranspose(
......@@ -110,12 +130,15 @@ ConstantBuffer cb =
// translation
* dx::XMMatrixTranslation(0.0f, 0.0f, 4.0f)
// projection
* dx::XMMatrixPerspectiveLH( 1.0f, heightWidthRatio, 0.1f, 10.0f)
* dx::XMMatrixPerspectiveLH(1.0f, heightWidthRatio, 0.1f, 10.0f)
)
};
/************************************
* 2.6 DefineColorConstBuffer
************************************/
// Define color constant buffer
Microsoft::WRL::ComPtr<ID3D11Buffer> pColorConstantBuffer;
Microsoft::WRL::ComPtr<ID3D11Buffer> pColorConstBuffer;
// Create constant buffer for color
struct ColorConstantBuffer
{
......@@ -140,35 +163,30 @@ const ColorConstantBuffer ccb =
}
};
// Define depth stencil buffer
Microsoft::WRL::ComPtr<ID3D11DepthStencilState> pDepthStencilState;
// Define depth stencil texture
Microsoft::WRL::ComPtr<ID3D11Texture2D> depthStencilTexture;
// Define depth stencil view
Microsoft::WRL::ComPtr<ID3D11DepthStencilView> pDSView;
/************************************
* 2.7 DefineVertexShader
************************************/
// Define Vertex Shader
Microsoft::WRL::ComPtr<ID3DBlob> pCompiledVertexBlob;
Microsoft::WRL::ComPtr<ID3D11VertexShader> pVertexShader;
/************************************
* 2.8 DefinePixelShader
************************************/
// Define Pixel Shader
Microsoft::WRL::ComPtr<ID3DBlob> pCompiledPixelBlob;
Microsoft::WRL::ComPtr<ID3D11PixelShader> pPixelShader;
/************************************
* 2.9 DefineInputLayout
************************************/
// Define input layout
ID3D11InputLayout* pInputLayout;
void DefineShader()
{
// Load vertex shader file into BLOB, and create COM object of pixel shader
D3DReadFileToBlob(L"PixelShader.cso", &pCompiledPixelBlob);
dev->CreatePixelShader(pCompiledPixelBlob->GetBufferPointer(), pCompiledPixelBlob->GetBufferSize(), nullptr, &pPixelShader);
// Load pixel shader file into BLOB, and create COM object of vertex shader
D3DReadFileToBlob(L"VertexShader.cso", &pCompiledVertexBlob);
dev->CreateVertexShader(pCompiledVertexBlob->GetBufferPointer(), pCompiledVertexBlob->GetBufferSize(), nullptr, &pVertexShader);
// bind pixel shader
devcon->PSSetShader(pPixelShader.Get(), nullptr, 0u);
// bind vertex shader
devcon->VSSetShader(pVertexShader.Get(), nullptr, 0u);
}
/************************************
* 2.3 DefineVertexBuffer
************************************/
void DefineVertexBuffer()
{
D3D11_BUFFER_DESC bd = {};
......@@ -184,8 +202,16 @@ void DefineVertexBuffer()
// Create vertex buffer
dev->CreateBuffer(&bd, &sd, &pVertexBuffer);
// Bind vertex buffer to pipeline
const UINT stride = sizeof(Vertex);
const UINT offset = 0u;
devcon->IASetVertexBuffers(0u, 1u, pVertexBuffer.GetAddressOf(), &stride, &offset);
}
/************************************
* 2.4 DefineIndexBuffer
************************************/
void DefineIndexBuffer()
{
D3D11_BUFFER_DESC ibd = {};
......@@ -206,9 +232,12 @@ void DefineIndexBuffer()
devcon->IASetIndexBuffer(pIndexBuffer.Get(), DXGI_FORMAT_R16_UINT, 0u);
}
void DefineConstantBuffer(float angle, float z)
/************************************
* 2.5 DefineTransConstBuffer
************************************/
void DefineTransConstBuffer(float angle, float z)
{
cb =
tcb =
{
// transpose the matrix to change from row_major to column_major
dx::XMMatrixTranspose(
......@@ -230,19 +259,22 @@ void DefineConstantBuffer(float angle, float z)
cbd.Usage = D3D11_USAGE_DYNAMIC;
cbd.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
cbd.MiscFlags = 0u;
cbd.ByteWidth = sizeof(cb);
cbd.ByteWidth = sizeof(tcb);
cbd.StructureByteStride = 0u;
D3D11_SUBRESOURCE_DATA csd = {};
csd.pSysMem = &cb;
csd.pSysMem = &tcb;
// Create constant buffer
dev->CreateBuffer(&cbd, &csd, &pConstantBuffer);
dev->CreateBuffer(&cbd, &csd, &pTransConstBuffer);
// Bind constant buffer to vertex buffer
devcon->VSSetConstantBuffers(0u, 1u, pConstantBuffer.GetAddressOf());
devcon->VSSetConstantBuffers(0u, 1u, pTransConstBuffer.GetAddressOf());
}
void DefineColorConstantBuffer()
/************************************
* 2.6 DefineColorConstBuffer
************************************/
void DefineColorConstBuffer()
{
D3D11_BUFFER_DESC ccbd = {};
ccbd.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
......@@ -254,53 +286,41 @@ void DefineColorConstantBuffer()
D3D11_SUBRESOURCE_DATA ccsd = {};
ccsd.pSysMem = &ccb;
dev->CreateBuffer(&ccbd, &ccsd, &pColorConstantBuffer);
dev->CreateBuffer(&ccbd, &ccsd, &pColorConstBuffer);
// Bind constant buffer to vertex
devcon->PSSetConstantBuffers(0u, 1u, pColorConstantBuffer.GetAddressOf());
devcon->PSSetConstantBuffers(0u, 1u, pColorConstBuffer.GetAddressOf());
}
void DefineDepthStencilBuffer()
/************************************
* 2.7 DefineVertexShader
************************************/
void DefineVertexShader()
{
// Create depth stencil state
D3D11_DEPTH_STENCIL_DESC depthStencilDesc = {};
depthStencilDesc.DepthEnable = TRUE;
depthStencilDesc.DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ALL;
depthStencilDesc.DepthFunc = D3D11_COMPARISON_LESS;
// Create depth stencil state
dev->CreateDepthStencilState(&depthStencilDesc, &pDepthStencilState);
// bind depth state
devcon->OMSetDepthStencilState(pDepthStencilState.Get(), 1u);
// Create the depth stencil texture
D3D11_TEXTURE2D_DESC depthStencilTextureDesc = {};
depthStencilTextureDesc.Width = 800;
depthStencilTextureDesc.Height = 600;
depthStencilTextureDesc.MipLevels = 1u;
depthStencilTextureDesc.ArraySize = 1u;
depthStencilTextureDesc.Format = DXGI_FORMAT_D32_FLOAT;
depthStencilTextureDesc.SampleDesc.Count = 1u;
depthStencilTextureDesc.SampleDesc.Quality = 0u;
depthStencilTextureDesc.Usage = D3D11_USAGE_DEFAULT;
depthStencilTextureDesc.BindFlags = D3D11_BIND_DEPTH_STENCIL;
// Create texture
dev->CreateTexture2D(&depthStencilTextureDesc, nullptr, &depthStencilTexture);
// Load pixel shader file into BLOB, and create COM object of vertex shader
D3DReadFileToBlob(L"VertexShader.cso", &pCompiledVertexBlob);
dev->CreateVertexShader(pCompiledVertexBlob->GetBufferPointer(), pCompiledVertexBlob->GetBufferSize(), nullptr, &pVertexShader);
// Create the depth stencil view
D3D11_DEPTH_STENCIL_VIEW_DESC depthStencilViewDesc = {};
depthStencilViewDesc.Format = DXGI_FORMAT_D32_FLOAT;
depthStencilViewDesc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2D;
depthStencilViewDesc.Texture2D.MipSlice = 0u;
dev->CreateDepthStencilView(depthStencilTexture.Get(), &depthStencilViewDesc, &pDSView);
// bind vertex shader
devcon->VSSetShader(pVertexShader.Get(), nullptr, 0u);
}
// Bind depth stencil view to out put merger
//devcon->OMSetRenderTargets(1u, targetView.GetAddressOf(), pDSView.Get());
/************************************
* 2.8 DefinePixelShader
************************************/
void DefinePixelShader()
{
// Load vertex shader file into BLOB, and create COM object of pixel shader
D3DReadFileToBlob(L"PixelShader.cso", &pCompiledPixelBlob);
dev->CreatePixelShader(pCompiledPixelBlob->GetBufferPointer(), pCompiledPixelBlob->GetBufferSize(), nullptr, &pPixelShader);
// bind pixel shader
devcon->PSSetShader(pPixelShader.Get(), nullptr, 0u);
}
/************************************
* 2.9 DefineInputLayout
************************************/
void DefineInputLayout()
{
// Create input elements description, choosing whatever need to send to GPU
......@@ -324,23 +344,42 @@ void DefineInputLayout()
// Bind layout to pipeline
// bind vertex layout
devcon->IASetInputLayout(pInputLayout);
// bind render target
//devcon->OMSetRenderTargets(1u, targetView.GetAddressOf(), nullptr);
}
void DrawPrimitive()
/************************************
* 2.10 DefinePrimitiveTopology
************************************/
void DefinePrimitiveTopology()
{
// Set the vertex buffer to use. Pick up the vertex buffer created in previous step.
// Bind vertex buffer to pipeline
const UINT stride = sizeof(Vertex);
const UINT offset = 0u;
devcon->IASetVertexBuffers(0u, 1u, pVertexBuffer.GetAddressOf(), &stride, &offset);
// Set the primitive type to use
// Set primitive topology to triangle list (groups of 3 vertices)
devcon->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
}
/************************************
* 2.11 DefineViewPorts
************************************/
void DefineViewPorts()
{
// 指定View Port
D3D11_VIEWPORT viewport;
ZeroMemory(&viewport, sizeof(D3D11_VIEWPORT));
// 控制View port的位置
viewport.TopLeftX = 0;
viewport.TopLeftY = 0;
viewport.Width = 800;
viewport.Height = 600;
viewport.MinDepth = 0;
viewport.MaxDepth = 1;
devcon->RSSetViewports(1, &viewport);
}
/************************************
* 2.11 DrawPrimitive
************************************/
void DrawPrimitive()
{
// Draw the triangle.
// devcon->Draw((UINT)sizeof(vertices), 0u);
devcon->DrawIndexed((UINT)std::size(indices), 0u, 0u);
......@@ -348,12 +387,54 @@ void DrawPrimitive()
void drawSingleTriangle(float angle, float z)
{
DefineShader();
/************************************
* 2.3 DefineVertexBuffer
************************************/
DefineVertexBuffer();
/************************************
* 2.4 DefineIndexBuffer
************************************/
DefineIndexBuffer();
DefineConstantBuffer(angle, z);
DefineColorConstantBuffer();
/************************************
* 2.5 DefineTransConstBuffer
************************************/
DefineTransConstBuffer(angle, z);
/************************************
* 2.6 DefineColorConstBuffer
************************************/
DefineColorConstBuffer();
/************************************
* 2.7 DefineVertexShader
************************************/
DefineVertexShader();
/************************************
* 2.8 DefinePixelShader
************************************/
DefinePixelShader();
/************************************
* 2.9 DefineInputLayout
************************************/
DefineInputLayout();
/************************************
* 2.10 DefinePrimitiveTopology
************************************/
DefinePrimitiveTopology();
/************************************
* 2.11 DefineViewPorts
************************************/
DefineViewPorts();
/************************************
* 2.12 DrawPrimitive
************************************/
DrawPrimitive();
}
......@@ -363,8 +444,10 @@ void drawTriangle()
drawSingleTriangle(-timer.Peek(), 4.5f);
}
// this function initializes and prepares Direct3D for use
void InitD3D(HWND hWnd)
/************************************
* 1.1 CreateDeviceAndSwapChain
************************************/
void CreateDeviceAndSwapChain(HWND hWnd)
{
// create a struct to hold information about the swap chain
DXGI_SWAP_CHAIN_DESC scd;
......@@ -393,47 +476,119 @@ void InitD3D(HWND hWnd)
&dev, // ID3D11Device **ppDevice
NULL, // D3D_FEATURE_LEVEL *FeatureLevel
&devcon); // ID3D11DeviceContext **ppImmediateContext
}
/************************************
* 1.2 DefineRenderTargetView
************************************/
void DefineRenderTargetView()
{
// 从SwapChain中取得back buffer
Microsoft::WRL::ComPtr<ID3D11Texture2D> pBackBuffer;
swapchain->GetBuffer(0, __uuidof(ID3D11Texture2D), (LPVOID*)&pBackBuffer);
// 根据back buffer,创建新的View Target
dev->CreateRenderTargetView(pBackBuffer.Get(), NULL, &targetView);
}
/************************************
* 1.3 DefineDepthStencilView
************************************/
void DefineDepthStencilView()
{
// Create depth stencil state
D3D11_DEPTH_STENCIL_DESC depthStencilDesc = {};
depthStencilDesc.DepthEnable = TRUE;
depthStencilDesc.DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ALL;
depthStencilDesc.DepthFunc = D3D11_COMPARISON_LESS;
// Create depth stencil state
dev->CreateDepthStencilState(&depthStencilDesc, &pDepthStencilState);
// bind depth state
devcon->OMSetDepthStencilState(pDepthStencilState.Get(), 1u);
// Create the depth stencil texture
D3D11_TEXTURE2D_DESC depthStencilTextureDesc = {};
depthStencilTextureDesc.Width = 800;
depthStencilTextureDesc.Height = 600;
depthStencilTextureDesc.MipLevels = 1u;
depthStencilTextureDesc.ArraySize = 1u;
depthStencilTextureDesc.Format = DXGI_FORMAT_D32_FLOAT;
depthStencilTextureDesc.SampleDesc.Count = 1u;
depthStencilTextureDesc.SampleDesc.Quality = 0u;
depthStencilTextureDesc.Usage = D3D11_USAGE_DEFAULT;
depthStencilTextureDesc.BindFlags = D3D11_BIND_DEPTH_STENCIL;
DefineDepthStencilBuffer();
// Create texture
dev->CreateTexture2D(&depthStencilTextureDesc, nullptr, &depthStencilTexture);
// Create the depth stencil view
D3D11_DEPTH_STENCIL_VIEW_DESC depthStencilViewDesc = {};
depthStencilViewDesc.Format = DXGI_FORMAT_D32_FLOAT;
depthStencilViewDesc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2D;
depthStencilViewDesc.Texture2D.MipSlice = 0u;
dev->CreateDepthStencilView(depthStencilTexture.Get(), &depthStencilViewDesc, &pDSView);
}
/************************************
* 1.4 DefineRenderTarget
************************************/
void DefineRenderTarget()
{
// 将渲染目标设置成我们新创建的View Target
//devcon->OMSetRenderTargets(1u, targetView.GetAddressOf(), NULL);
devcon->OMSetRenderTargets(1u, targetView.GetAddressOf(), pDSView.Get());
}
// 指定View Port
D3D11_VIEWPORT viewport;
ZeroMemory(&viewport, sizeof(D3D11_VIEWPORT));
// 控制View port的位置
viewport.TopLeftX = 0;
viewport.TopLeftY = 0;
viewport.Width = 800;
viewport.Height = 600;
viewport.MinDepth = 0;
viewport.MaxDepth = 1;
devcon->RSSetViewports(1, &viewport);
// this function initializes and prepares Direct3D for use
void InitD3D(HWND hWnd)
{
/************************************
* 1.1 CreateDeviceAndSwapChain
************************************/
CreateDeviceAndSwapChain(hWnd);
/************************************
* 1.2 DefineRenderTargetView
************************************/
DefineRenderTargetView();
/************************************
* 1.3 DefineDepthStencilView
************************************/
DefineDepthStencilView();
/************************************
* 1.4 DefineRenderTarget
************************************/
DefineRenderTarget();
}
// this is the function used to render a single frame
void RenderFrame(void)
{
/************************************
* 2.1 ClearRenderTargetView
************************************/
// clear the back buffer to a deep blue
const float color[] = { 0.0f, 0.2f, 0.4f, 1.0f };
devcon->ClearRenderTargetView(targetView.Get(), color);
/************************************
* 2.2 ClearDepthStencilView
************************************/
// clear the depth stencil view
devcon->ClearDepthStencilView(pDSView.Get(), D3D11_CLEAR_DEPTH, 1.0f, 0u);
/************************************
* 2.3 - 2.12 Repeat graphic objects
************************************/
// do 3D rendering on the back buffer here
drawTriangle();
/************************************
* 3 DrawPrimitive
************************************/
// switch the back buffer and the front buffer
// 切换显示,将back buffer的内容交换到front buffer
swapchain->Present(0, 0);
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment