Directx11學習筆記【十四】 使用最新的Effect框架和SDK

原文: Directx11學習筆記【十四】 使用最新的Effect框架和SDK

  因爲以前一直在看directx11龍書學習,所以sdk一直用的Microsoft DirectX SDK (June 2010) 版本,最近在stackoverflow上問dx11相關問題時,一直被大神吐槽爲什麼還用已經廢棄的directx sdk,因爲directx sdk如今已經和windows sdk合併到一塊兒了,只能去下windows sdk了。爲了方便索性直接換了vs 2015社區版,裏面自帶了(windows sdk),既然sdk換了最新的,effect框架也要換最新的啊(Effect框架已經被微軟開源託管在github上,https://github.com/Microsoft/FX11/wiki)。還有stackoverflow上都推薦DirectXTK,這方面中文資料很是少,只能靠本身慢慢看文檔示例學了,等看得差很少了,會考慮用DirectXTK寫的。之後教程仍是基本跟着龍書走,我會將龍書實現的效果用本身封裝的框架寫一遍,尤爲是一些過期的函數方法我也會換上對應的新方法。html

  因爲directx sdk集成在windows sdk中了,因此在建項目的時候就不用設置引用目錄和庫目錄的路徑了,只需設置連接庫就能夠了,仍是挺方便的。因爲換了sdk,一些方法參數之類的都略有不一樣,我又把以前的基類Dx11DemoBase從新封裝了一遍,爲了練習把前一個教程HillsDemo又從新寫了一遍,體會一下有哪些改動。不一樣之處都在代碼中給出了註釋。c++

  前面教程編譯shader用的是兩個方法D3DX11CompileFromFile和D3DX11CreateEffectFromMemory,顯得比較麻煩,在最新的FX11(Effect框架)中這兩個方法已經廢棄了,咱們能夠採用D3DX11CompileEffectFromFile來編譯shader,一步到位尤其方便 git

 1 //compile shader
 2     ID3DBlob* errorBlob;  3     DWORD shaderFlags = D3DCOMPILE_ENABLE_STRICTNESS;  4 
 5 #if defined _DEBUG || defined DEBUG
 6     shaderFlags = D3DCOMPILE_DEBUG;  7 #endif
 8 
 9     hr = D3DX11CompileEffectFromFile(L"color.fx", nullptr, D3D_COMPILE_STANDARD_FILE_INCLUDE, shaderFlags, 10         0, m_pd3dDevice, &m_pFx, &errorBlob); 11     if (FAILED(hr)) 12  { 13         MessageBox(nullptr, (LPCWSTR)errorBlob->GetBufferPointer(), L"error", MB_OK); 14         return hr; 15  } 16 
17     m_pTechnique = m_pFx->GetTechniqueByName("ColorTech"); 18     m_pFxWorldViewProj = m_pFx->GetVariableByName("gWorldViewProj")->AsMatrix();

  下面給出改動後的HillsDemo代碼(其實大致差很少),在看新的官方實例時發現代碼都是c++11風格(使用nullptr代替NULL,使用c++風格類型轉換static_cast/reinterpret_cast,DirectXTK中大量使用智能指針等),所以咱也儘可能保持相同的風格以養成寫規範代碼的好習慣。此外註釋我也儘可能用英文寫,一方面有些用漢語不太好說明,另外一方面因爲要常常在stackoverflow上提問老外看不懂漢語還得臨時改英文挺麻煩的。github

  Base基類此次咱們添加了depth/stencil緩衝,以便之後用到的時候不用再臨時添加了。windows

 1 //create depth stencil texture
 2  D3D11_TEXTURE2D_DESC descDepth;  3     descDepth.Width = m_width;  4     descDepth.Height = m_height;  5     descDepth.ArraySize = 1;  6     descDepth.MipLevels = 1;  7     descDepth.Format = DXGI_FORMAT_D24_UNORM_S8_UINT;  8     descDepth.SampleDesc.Count = 1;  9     descDepth.SampleDesc.Quality = 0; 10     descDepth.Usage = D3D11_USAGE_DEFAULT; 11     descDepth.BindFlags = D3D11_BIND_DEPTH_STENCIL; 12     descDepth.CPUAccessFlags = 0; 13     descDepth.MiscFlags = 0; 14     hr = m_pd3dDevice->CreateTexture2D(&descDepth, nullptr, &m_pDepthStencilBuffer); 15     if (FAILED(hr)) 16         return hr; 17 
18     //create the depth stencil view
19  D3D11_DEPTH_STENCIL_VIEW_DESC descDSV; 20     ZeroMemory(&descDSV, sizeof(descDSV)); 21     descDSV.Format = descDepth.Format; 22     descDSV.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2D; 23     descDSV.Texture2D.MipSlice = 0; 24     hr = m_pd3dDevice->CreateDepthStencilView(m_pDepthStencilBuffer, &descDSV, &m_pDepthStencilView); 25     if (FAILED(hr)) 26         return hr;

  在實際Demo中每幀要clear一下框架

1 //clear depth/stencil view
2     m_pImmediateContext->ClearDepthStencilView(m_pDepthStencilView, D3D11_CLEAR_DEPTH | D3D11_CLEAR_STENCIL, 3         1.0f, 0);

 

  

  Dx11DemoBase.h

 1 #ifndef _DX11DEMOBASE_H_  2 #define _DX11DEMOBASE_H_
 3 
 4 #include <string>
 5 #include <windows.h>
 6 #include <d3d11.h>
 7 #include <d3dcompiler.h>
 8 #include <DirectXMath.h>//don't use xnamath.h
 9 #include <directxcolors.h>
10 
11 using namespace DirectX; 12 
13 class Dx11DemoBase 14 { 15 public: 16  Dx11DemoBase(); 17     virtual ~Dx11DemoBase(); 18 
19     std::wstring  m_mainWndCaption;                    //title
20     float AspectRatio() const;                        //width/height
21 
22     bool InitDirect3D(HINSTANCE hInstance, HWND hWnd); 23 
24     void ShutDown();                                //release
25 
26     virtual bool LoadContent();                        //init concrete content
27     virtual void UnLoadContent();                    //release 
28 
29     virtual void Update(float dt) = 0; 30     virtual void Render() = 0; 31 
32     virtual void OnMouseDown(WPARAM btnState, int x, int y) {} 33     virtual void OnMouseUp(WPARAM btnState, int x, int y) {} 34     virtual void OnMouseMove(WPARAM btnState, int x, int y) {} 35 
36 protected: 37     UINT                    m_width;                //window width
38     UINT                    m_height;                //window height
39  HINSTANCE m_hInstance; 40  HWND m_hWnd; 41  D3D_DRIVER_TYPE m_driverType; 42  D3D_FEATURE_LEVEL m_featureLevel; 43     ID3D11Device* m_pd3dDevice; 44     ID3D11DeviceContext* m_pImmediateContext; 45     IDXGISwapChain* m_pSwapChain; 46     ID3D11RenderTargetView* m_pRenderTargetView; 47     ID3D11Texture2D* m_pDepthStencilBuffer; 48     ID3D11DepthStencilView* m_pDepthStencilView; 49 }; 50 
51 #endif//_DX11DEMOBASE_H_

  Dx11DemoBase.cpp

 1 #include "Dx11DemoBase.h"
 2 
 3 Dx11DemoBase::Dx11DemoBase():  4 m_mainWndCaption(L"Directx11 Application"),  5 m_driverType(D3D_DRIVER_TYPE_HARDWARE),  6 m_featureLevel(D3D_FEATURE_LEVEL_11_0),  7 m_pd3dDevice(nullptr),  8 m_pImmediateContext(nullptr),  9 m_pRenderTargetView(nullptr),  10 m_pDepthStencilBuffer(nullptr),  11 m_pDepthStencilView(nullptr),  12 m_pSwapChain(nullptr),  13 m_hWnd(nullptr),  14 m_width(800),  15 m_height(600)  16 {}  17 
 18 Dx11DemoBase::~Dx11DemoBase()  19 {  20  ShutDown();  21 }  22 
 23 float Dx11DemoBase::AspectRatio() const
 24 {  25     return static_cast<float>(m_width / m_height);  26 }  27 
 28 bool Dx11DemoBase::InitDirect3D(HINSTANCE hInstance, HWND hWnd)  29 {  30     HRESULT hr = S_OK;  31     m_hInstance = hInstance;  32     m_hWnd = hWnd;  33  RECT rc;  34     GetClientRect(m_hWnd, &rc);  35     m_width = rc.right - rc.left;  36     m_height = rc.bottom - rc.top;  37 
 38     UINT createDeviceFlags = 0;  39 
 40 #ifdef _DEBUG  41     createDeviceFlags |= D3D11_CREATE_DEVICE_DEBUG;  42 #endif
 43 
 44     D3D_DRIVER_TYPE driverTypes[] =
 45  {  46  D3D_DRIVER_TYPE_HARDWARE,  47  D3D_DRIVER_TYPE_WARP,  48  D3D_DRIVER_TYPE_REFERENCE  49  };  50     UINT numDriverTypes = ARRAYSIZE(driverTypes);  51 
 52     D3D_FEATURE_LEVEL featureLevels[] =
 53  {  54  D3D_FEATURE_LEVEL_11_0,  55  D3D_FEATURE_LEVEL_10_1,  56  D3D_FEATURE_LEVEL_10_0  57  };  58     UINT numFeatureLevels = ARRAYSIZE(featureLevels);  59 
 60  DXGI_SWAP_CHAIN_DESC sd;  61     ZeroMemory(&sd, sizeof(sd));  62     sd.BufferCount = 1;  63     sd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;  64     sd.BufferDesc.Width = m_width;  65     sd.BufferDesc.Height = m_height;  66     sd.BufferDesc.RefreshRate.Numerator = 60;  67     sd.BufferDesc.RefreshRate.Denominator = 1;  68     sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;  69     sd.OutputWindow = m_hWnd;  70     sd.SampleDesc.Count = 1;  71     sd.SampleDesc.Quality = 0;  72     sd.Windowed = TRUE;  73 
 74     //create device and swapchain
 75     for (UINT driverTypeIndex = 0; driverTypeIndex < numDriverTypes; ++driverTypeIndex)  76  {  77         hr = D3D11CreateDeviceAndSwapChain(nullptr, driverTypes[driverTypeIndex], nullptr,  78             createDeviceFlags, featureLevels, numFeatureLevels, D3D11_SDK_VERSION, &sd, &m_pSwapChain,  79             &m_pd3dDevice, &m_featureLevel, &m_pImmediateContext);  80         if (SUCCEEDED(hr))  81  {  82             m_driverType = driverTypes[driverTypeIndex];  83             break;  84  }  85  }  86     if (FAILED(hr))  87         return hr;  88 
 89     //create render target view
 90     ID3D11Texture2D *pBackBuffer = nullptr;  91     hr = m_pSwapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), reinterpret_cast<void**>(&pBackBuffer));  92     if (FAILED(hr))  93         return hr;  94 
 95     hr = m_pd3dDevice->CreateRenderTargetView(pBackBuffer, nullptr, &m_pRenderTargetView);  96     pBackBuffer->Release();  97     if (FAILED(hr))  98         return hr;  99 
100     m_pImmediateContext->OMSetRenderTargets(1, &m_pRenderTargetView, nullptr); 101     
102     //create depth stencil texture
103  D3D11_TEXTURE2D_DESC descDepth; 104     descDepth.Width = m_width; 105     descDepth.Height = m_height; 106     descDepth.ArraySize = 1; 107     descDepth.MipLevels = 1; 108     descDepth.Format = DXGI_FORMAT_D24_UNORM_S8_UINT; 109     descDepth.SampleDesc.Count = 1; 110     descDepth.SampleDesc.Quality = 0; 111     descDepth.Usage = D3D11_USAGE_DEFAULT; 112     descDepth.BindFlags = D3D11_BIND_DEPTH_STENCIL; 113     descDepth.CPUAccessFlags = 0; 114     descDepth.MiscFlags = 0; 115     hr = m_pd3dDevice->CreateTexture2D(&descDepth, nullptr, &m_pDepthStencilBuffer); 116     if (FAILED(hr)) 117         return hr; 118 
119     //create the depth stencil view
120  D3D11_DEPTH_STENCIL_VIEW_DESC descDSV; 121     ZeroMemory(&descDSV, sizeof(descDSV)); 122     descDSV.Format = descDepth.Format; 123     descDSV.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2D; 124     descDSV.Texture2D.MipSlice = 0; 125     hr = m_pd3dDevice->CreateDepthStencilView(m_pDepthStencilBuffer, &descDSV, &m_pDepthStencilView); 126     if (FAILED(hr)) 127         return hr; 128 
129     m_pImmediateContext->OMSetRenderTargets(1, &m_pRenderTargetView, m_pDepthStencilView); 130 
131     //setup the viewport
132  D3D11_VIEWPORT vp; 133     vp.Width = static_cast<float>(m_width); 134     vp.Height = static_cast<float>(m_height); 135     vp.MinDepth = 0.0f; 136     vp.MaxDepth = 1.0f; 137     vp.TopLeftX = 0.0f; 138     vp.TopLeftY = 0.0f; 139     m_pImmediateContext->RSSetViewports(1, &vp); 140 
141     return LoadContent(); 142 } 143 
144 
145 void Dx11DemoBase::ShutDown() 146 { 147  UnLoadContent(); 148     if (m_pImmediateContext) m_pImmediateContext->ClearState(); 149 
150     if (m_pRenderTargetView) m_pRenderTargetView->Release(); 151     if (m_pSwapChain) m_pSwapChain->Release(); 152     if (m_pImmediateContext) m_pImmediateContext->Release(); 153     if (m_pd3dDevice) m_pd3dDevice->Release(); 154     if (m_pDepthStencilBuffer) m_pDepthStencilBuffer->Release(); 155     if (m_pDepthStencilView) m_pDepthStencilView->Release(); 156 } 157 
158 bool Dx11DemoBase::LoadContent() 159 { 160     return true; 161 } 162 
163 void Dx11DemoBase::UnLoadContent(){}

 

  GeometryGenerator類中代碼沒什麼改變再也不給出ide

HillsDemo.h

 1 #ifndef _HILLSDEMO_H_  2 #define _HILLSDEMO_H_
 3 
 4 #include "Dx11DemoBase.h"
 5 #include "d3dx11effect.h"
 6 #include "GeometryGenerator.h"
 7 
 8 
 9 #pragma comment(lib,"d3d11.lib")
10 #pragma comment(lib,"Effects11.lib")
11 #pragma comment(lib,"d3dcompiler.lib")
12 #pragma comment(lib,"winmm.lib")
13 #pragma comment(lib,"comctl32.lib")
14 #pragma comment(lib,"dxguid.lib")
15 
16 class HillsDemo : public Dx11DemoBase 17 { 18 public: 19  HillsDemo(); 20     ~HillsDemo(); 21 
22     bool LoadContent() override; 23     void UnLoadContent() override; 24 
25     void Update(float dt) override; 26     void Render() override; 27 
28     void OnMouseDown(WPARAM btnState, int x, int y) override; 29     void OnMouseUp(WPARAM btnState, int x, int y) override; 30     void OnMouseMove(WPARAM btnState, int x, int y) override; 31 private: 32     ID3D11Buffer* m_pVertexBuffer; 33     ID3D11Buffer* m_pIndexBuffer; 34     ID3D11InputLayout* m_pInputLayout; 35 
36     ID3DX11Effect* m_pFx; 37     ID3DX11EffectTechnique* m_pTechnique; 38     ID3DX11EffectMatrixVariable* m_pFxWorldViewProj; 39  XMFLOAT4X4 m_world; 40  XMFLOAT4X4 m_view; 41  XMFLOAT4X4 m_proj; 42 
43     
44  UINT m_gridIndexCount; 45     float m_theta; 46     float m_phi; 47     float m_radius; 48  POINT m_lastMousePos; 49 
50     float GetHeight(float x, float z)const; 51 
52 }; 53 
54 #endif//_HILLSDEMO_H_

HillsDemo.cpp

 1 #include "HillsDemo.h"
 2 
 3 struct Vertex  4 {  5  XMFLOAT3 pos;  6  XMFLOAT4 color;  7  Vertex(XMFLOAT3 p, XMFLOAT4 c) : pos(p), color(c) {}  8 };  9 
 10 HillsDemo::HillsDemo() :m_pInputLayout(nullptr), m_pVertexBuffer(nullptr),m_pFx(nullptr), m_gridIndexCount(0),  11 m_theta(1.5f*XM_PI), m_phi(0.1f*XM_PI), m_radius(200.0f)  12 {  13     XMMATRIX I = XMMatrixIdentity();  14     XMStoreFloat4x4(&m_world, I);  15     XMStoreFloat4x4(&m_view, I);  16     XMStoreFloat4x4(&m_proj, I);  17 }  18 
 19 HillsDemo::~HillsDemo()  20 {  21 
 22 }  23 
 24 bool HillsDemo::LoadContent()  25 {  26  HRESULT hr;  27 
 28     //create vertex buffer
 29  GeometryGenerator::MeshData grid;  30  GeometryGenerator geoGen;  31     geoGen.CreateGrid(160.0f, 160.0f, 50, 50, grid);  32     m_gridIndexCount = grid.indices.size();  33 
 34     std::vector<Vertex> vertices(grid.vertices.size(), Vertex(XMFLOAT3(0, 0, 0), XMFLOAT4(0, 0, 0, 0)));  35     for (UINT i = 0; i < grid.vertices.size(); ++i)  36  {  37         XMFLOAT3 p = grid.vertices[i].Position;  38         p.y = GetHeight(p.x, p.z);  39 
 40         vertices[i].pos = p;  41 
 42         //render vertex with different color according to height
 43         if (p.y < -10.0f)  44  {  45             //sandy beach color
 46             vertices[i].color = XMFLOAT4(1.0f, 0.96f, 0.62f, 1.0f);  47  }  48         else if (p.y < 5.0f)  49  {  50             //dark yellow-green color
 51             vertices[i].color = XMFLOAT4(0.1f, 0.48f, 0.19f, 1.0f);  52  }  53         else if (p.y < 12.0f)  54  {  55             //light yellow-green color
 56             vertices[i].color = XMFLOAT4(0.48f, 0.77f, 0.46f, 1.0f);  57  }  58         else if (p.y < 20.f)  59  {  60             //dark brown color
 61             vertices[i].color = XMFLOAT4(0.45f, 0.39f, 0.34f, 1.0f);  62  }  63         else
 64  {  65             //white snow color
 66             vertices[i].color = XMFLOAT4(1.0f, 1.0f, 1.0f, 1.0f);  67  }  68  }  69 
 70  D3D11_BUFFER_DESC vertexDesc;  71     ZeroMemory(&vertexDesc, sizeof(vertexDesc));  72     vertexDesc.Usage = D3D11_USAGE_IMMUTABLE;  73     vertexDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER;  74     vertexDesc.ByteWidth = sizeof(Vertex)* grid.vertices.size();  75  D3D11_SUBRESOURCE_DATA resourceData;  76     ZeroMemory(&resourceData, sizeof(resourceData));  77     resourceData.pSysMem = &vertices[0];  78     hr = m_pd3dDevice->CreateBuffer(&vertexDesc, &resourceData, &m_pVertexBuffer);  79     if (FAILED(hr))  80  {  81         return false;  82  }  83 
 84     //set vertex buffer
 85     UINT stride = sizeof(Vertex);  86     UINT offset = 0;  87     m_pImmediateContext->IASetVertexBuffers(0, 1, &m_pVertexBuffer, &stride, &offset);  88     //set primitive topology
 89     m_pImmediateContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);  90 
 91     //create index buffer
 92  D3D11_BUFFER_DESC indexDesc;  93     ZeroMemory(&indexDesc, sizeof(indexDesc));  94     indexDesc.Usage = D3D11_USAGE_IMMUTABLE;  95     indexDesc.BindFlags = D3D11_BIND_INDEX_BUFFER;  96     indexDesc.ByteWidth = sizeof(UINT)* m_gridIndexCount;  97 
 98  D3D11_SUBRESOURCE_DATA indexData;  99     ZeroMemory(&indexData, sizeof(indexData)); 100     indexData.pSysMem = &grid.indices[0]; 101     hr = m_pd3dDevice->CreateBuffer(&indexDesc, &indexData, &m_pIndexBuffer); 102     if (FAILED(hr)) 103  { 104         return false; 105  } 106 
107     //set index buffer
108     m_pImmediateContext->IASetIndexBuffer(m_pIndexBuffer, DXGI_FORMAT_R32_UINT, 0); 109 
110     //compile shader
111     ID3DBlob* errorBlob; 112     DWORD shaderFlags = D3DCOMPILE_ENABLE_STRICTNESS; 113 
114 #if defined _DEBUG || defined DEBUG
115     shaderFlags = D3DCOMPILE_DEBUG; 116 #endif
117 
118     hr = D3DX11CompileEffectFromFile(L"color.fx", nullptr, D3D_COMPILE_STANDARD_FILE_INCLUDE, shaderFlags, 119         0, m_pd3dDevice, &m_pFx, &errorBlob); 120     if (FAILED(hr)) 121  { 122         MessageBox(nullptr, (LPCWSTR)errorBlob->GetBufferPointer(), L"error", MB_OK); 123         return hr; 124  } 125     
126     m_pTechnique = m_pFx->GetTechniqueByName("ColorTech"); 127     m_pFxWorldViewProj = m_pFx->GetVariableByName("gWorldViewProj")->AsMatrix(); 128 
129 
130     //define the input layout
131     D3D11_INPUT_ELEMENT_DESC colorLayout[] =
132  { 133         { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 }, 134         { "COLOR", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0 } 135  }; 136 
137     UINT numLayoutElements = ARRAYSIZE(colorLayout); 138  D3DX11_PASS_DESC passDesc; 139     m_pTechnique->GetPassByIndex(0)->GetDesc(&passDesc); 140 
141     //create the input layout
142     hr = m_pd3dDevice->CreateInputLayout(colorLayout, numLayoutElements, passDesc.pIAInputSignature, 143         passDesc.IAInputSignatureSize, &m_pInputLayout); 144     if (FAILED(hr)) 145         return hr; 146 
147     //set input layout
148     m_pImmediateContext->IASetInputLayout(m_pInputLayout); 149 
150     return true; 151 } 152 
153 void HillsDemo::UnLoadContent() 154 { 155     if (m_pVertexBuffer) m_pVertexBuffer->Release(); 156     if (m_pIndexBuffer)    m_pIndexBuffer->Release(); 157     if (m_pInputLayout)    m_pInputLayout->Release(); 158     if (m_pTechnique) m_pTechnique->Release(); 159 } 160 
161 void HillsDemo::Update(float dt) 162 { 163     float x = m_radius*sinf(m_phi)*cosf(m_theta); 164     float z = m_radius*sinf(m_phi)*sinf(m_theta); 165     float y = m_radius*cosf(m_phi); 166 
167     XMVECTOR pos = XMVectorSet(x, y, z, 1.0f); 168     XMVECTOR target = XMVectorSet(0.0f, 0.0f, 0.0f, 1.0f); 169     XMVECTOR up = XMVectorSet(0.0f, 1.0f, 0.0f, 0.0f); 170 
171     XMMATRIX V = XMMatrixLookAtLH(pos, target, up); 172     XMStoreFloat4x4(&m_view, V); 173     XMMATRIX T = XMMatrixPerspectiveFovLH(XM_PIDIV4, m_width / static_cast<float>(m_height), 174         1.0f, 1000.0f); 175     XMStoreFloat4x4(&m_proj, T); 176 } 177 
178 void HillsDemo::Render() 179 { 180     if (m_pImmediateContext == 0) 181         return; 182     //clear render target view
183     float clearColor[4] = { 0.0f, 0.0f, 1.0f, 1.0f }; 184     m_pImmediateContext->ClearRenderTargetView(m_pRenderTargetView, clearColor); 185     
186     //clear depth/stencil view
187     m_pImmediateContext->ClearDepthStencilView(m_pDepthStencilView, D3D11_CLEAR_DEPTH | D3D11_CLEAR_STENCIL, 188         1.0f, 0); 189 
190     //set constant buffer
191     XMMATRIX world = XMLoadFloat4x4(&m_world); 192     XMMATRIX view = XMLoadFloat4x4(&m_view); 193     XMMATRIX proj = XMLoadFloat4x4(&m_proj); 194     XMMATRIX worldViewProj = world*view*proj; 195 
196 
197  D3DX11_TECHNIQUE_DESC techDesc; 198     m_pTechnique->GetDesc(&techDesc); 199     for (UINT i = 0; i < techDesc.Passes; ++i) 200  { 201         m_pFxWorldViewProj->SetMatrix(reinterpret_cast<float*>(&worldViewProj)); 202         m_pTechnique->GetPassByIndex(i)->Apply(0, m_pImmediateContext); 203         m_pImmediateContext->DrawIndexed(m_gridIndexCount, 0, 0); 204  } 205 
206     m_pSwapChain->Present(0, 0); 207 } 208 
209 void HillsDemo::OnMouseDown(WPARAM btnState, int x, int y) 210 { 211     m_lastMousePos.x = x; 212     m_lastMousePos.y = y; 213  SetCapture(m_hWnd); 214 } 215 
216 void HillsDemo::OnMouseUp(WPARAM btnState, int x, int y) 217 { 218  ReleaseCapture(); 219 } 220 
221 //restrict the number
222 template<typename T>
223 static T Clamp(const T& x, const T& low, const T& high) 224 { 225     return x < low ? low : (x > high ? high : x); 226 } 227 
228 void HillsDemo::OnMouseMove(WPARAM btnState, int x, int y) 229 { 230     if ((btnState & MK_LBUTTON) != 0) 231  { 232         // make each pixel correspond to a quarter of a degree.
233         float dx = XMConvertToRadians(0.25f*static_cast<float>(x - m_lastMousePos.x)); 234         float dy = XMConvertToRadians(0.25f*static_cast<float>(y - m_lastMousePos.y)); 235 
236         // update angles based on input to orbit camera around box.
237         m_theta += dx; 238         m_phi += dy; 239 
240         // restrict the angle mPhi.
241         m_phi = Clamp(m_phi, 0.1f, XM_PI - 0.1f); 242  } 243     else if ((btnState & MK_RBUTTON) != 0) 244  { 245         // make each pixel correspond to 0.2 unit in the scene.
246         float dx = 0.2f*static_cast<float>(x - m_lastMousePos.x); 247         float dy = 0.2f*static_cast<float>(y - m_lastMousePos.y); 248 
249         // update the camera radius based on input.
250         m_radius += dx - dy; 251 
252         // restrict the radius.
253         m_radius = Clamp(m_radius, 50.0f, 500.0f); 254  } 255 
256     m_lastMousePos.x = x; 257     m_lastMousePos.y = y; 258 } 259 
260 float HillsDemo::GetHeight(float x, float z) const
261 { 262     return 0.3f*(z*sinf(0.1f*x) + x*cosf(0.1f*z)); 263 }

 

main.cpp

 1 #include <windows.h>
 2 #include <windowsx.h>
 3 #include <memory>
 4 #include "HillsDemo.h"
 5 using namespace std;  6 
 7 std::shared_ptr<Dx11DemoBase> demo = make_shared<HillsDemo>();  8 
 9 LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); 10 
11 int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nShowCmd) 12 { 13  UNREFERENCED_PARAMETER(hPrevInstance); 14  UNREFERENCED_PARAMETER(lpCmdLine); 15 
16  WNDCLASSEX wcex; 17     wcex.cbClsExtra = 0; 18     wcex.cbSize = sizeof(wcex); 19     wcex.cbWndExtra = 0; 20     wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); 21     wcex.hCursor = LoadCursor(nullptr, IDC_ARROW); 22     wcex.hIcon = LoadIcon(nullptr, IDI_WINLOGO); 23     wcex.hIconSm = wcex.hIcon; 24     wcex.hInstance = hInstance; 25     wcex.lpfnWndProc = WndProc; 26     wcex.lpszClassName = L"HillsDemo"; 27     wcex.lpszMenuName = nullptr; 28     wcex.style = CS_HREDRAW | CS_VREDRAW; 29 
30     if (!RegisterClassEx(&wcex)) 31         return 0; 32 
33 
34     RECT rc = { 0, 0, 800, 600 }; 35     AdjustWindowRect(&rc, WS_OVERLAPPEDWINDOW, false); 36 
37     HWND hwnd = CreateWindowEx(WS_EX_APPWINDOW, L"HillsDemo", L"HillsDemo", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 38         CW_USEDEFAULT, rc.right - rc.left, rc.bottom - rc.top, nullptr, nullptr, hInstance, nullptr); 39 
40     if (!hwnd) 41         return 0; 42 
43  ShowWindow(hwnd, nShowCmd); 44 
45 
46     bool result = demo->InitDirect3D(hInstance, hwnd); 47     if (!result) 48         return 0; 49 
50  MSG msg; 51     ZeroMemory(&msg, sizeof(msg)); 52     while (msg.message != WM_QUIT) 53  { 54         if (PeekMessage(&msg, nullptr, 0, 0, PM_REMOVE)) 55  { 56             TranslateMessage(&msg); 57             DispatchMessage(&msg); 58  } 59         demo->Update(0.0f); 60         demo->Render(); 61  } 62     demo->ShutDown(); 63     return static_cast<int>(msg.wParam); 64 } 65 
66 LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) 67 { 68  PAINTSTRUCT paintStruct; 69  HDC hdc; 70     switch (message) 71  { 72     case WM_PAINT: 73         hdc = BeginPaint(hWnd, &paintStruct); 74         EndPaint(hWnd, &paintStruct); 75         break; 76     case WM_DESTROY: 77         PostQuitMessage(0); 78         break; 79     case WM_LBUTTONDOWN: 80     case WM_MBUTTONDOWN: 81     case WM_RBUTTONDOWN: 82         demo->OnMouseDown(wParam, GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam)); 83         return 0; 84     case WM_LBUTTONUP: 85     case WM_MBUTTONUP: 86     case WM_RBUTTONUP: 87         demo->OnMouseUp(wParam, GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam)); 88         return 0; 89     case WM_MOUSEMOVE: 90         demo->OnMouseMove(wParam, GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam)); 91         return 0; 92     default: 93         return DefWindowProc(hWnd, message, wParam, lParam); 94  } 95     return 0; 96 }

 

好了代碼就這些了,最後讓咱們看張圖緩解下疲勞吧函數

相關文章
相關標籤/搜索