当前位置:   article > 正文

Directx11基础教程二之Directx11初始化_d3d11教程

d3d11教程

      


一,看本节教程前应该掌握:

        (1)掌握  D3D11基础教程一之D3D11框架

 

二,程序的结构如下:

      



具体在VS2015的代码:                                                                                               


三,程序的具体代码如下:


好的,下面D3D11的初始化我分为十二个步骤,在源代码我我做出了标记,其实这跟D3D11龙书给出D3D11初始化的步骤差不多,就是多出了获取显卡信息的第一步.

好的,先贴出我的D3DClass.H代码



D3DClass.h

  1. #ifndef D3D_CLASS_H
  2. #define D3D_CLASS_H
  3. #define HR(X) {if(FAILED(X)) { MessageBox(0,L"Create Failed",0,0); return false;}}
  4. #define ReleaseCOM(x) { if (x) { x->Release(); x = 0; } }
  5. #include<Windows.h>
  6. #include<d3d11.h>
  7. #include<D3Dcommon.h> //???
  8. #include<D3DX11.h>
  9. #include<xnamath.h>
  10. #include<iostream>
  11. #include<istream>
  12. #include<ostream>
  13. #include<strstream>
  14. #include<fstream>
  15. using namespace std;
  16. class D3DClass
  17. {
  18. private:
  19. bool mVsyncEnable; //是否限帧渲染
  20. int mVideoCardMemory; //显卡内存
  21. char mVideoCardDescription[128]; //显卡名字
  22. private:
  23. ID3D11Device* md3dDevice;//D3D11设备
  24. ID3D11DeviceContext* md3dImmediateContext;//D3D11设备上下文
  25. IDXGISwapChain* md3dSwapChain;//D3D交换链
  26. ID3D11RenderTargetView* md3dRenderTargetView; //D3D11渲染目标视图
  27. ID3D11DepthStencilView* md3dDepthStencilView; //D3D11深度(模板)视图
  28. ID3D11Texture2D* md3dDepthStencilBuffer; //D3D11的“DepthStencil缓存”
  29. ID3D11DepthStencilState* md3dDepthStencilState; //深度(模板)缓存状态
  30. ID3D11RasterizerState* md3dRasterizerState; //D3D的光栅化状态
  31. private:
  32. XMMATRIX mWorldMatrix; //世界变换矩阵
  33. XMMATRIX mOrthoMatrix;; //正交矩阵??
  34. XMMATRIX mProjMatrix; //投影矩阵
  35. public:
  36. //构造,拷贝构造,析构函数
  37. D3DClass();
  38. D3DClass(const D3DClass&);
  39. ~D3DClass();
  40. //D3DClass初始化函数
  41. bool Initialize(int ScreenWidth, int ScreenHeight, bool vsync, HWND hwnd, bool fullscreen, float ScreenDepth, float ScreenNear);
  42. //关闭D3DClass函数
  43. void Shutdown();
  44. //绘制场景函数
  45. void BeginScene(float red, float green, float blue, float alpha);
  46. void EndScene();
  47. //Get函数
  48. ID3D11Device* GetDevice() { return md3dDevice; }
  49. ID3D11DeviceContext* GetDeviceContext(){ return md3dImmediateContext; }
  50. XMMATRIX GetWorldMatrix() { return mWorldMatrix; }
  51. XMMATRIX GetOrthoMatrix() { return mOrthoMatrix; }
  52. XMMATRIX GetmProjMatrix() { return mProjMatrix; };
  53. void GetVideoCardInfo(char*, int&); //获取显卡信息
  54. };
  55. #endif // !D3D_CLASS_H



D3DClass.cpp

  1. bool D3DClass::Initialize(int ScreenWidth, int ScreenHeight, bool vsync, HWND hwnd, bool fullscreen, float ScreenDepth, float ScreenNear)
  2. {
  3. float fieldOfView, screenAspect;
  4. //--------------------------------------------------------------
  5. //第一,获取显示模式信息和显卡信息
  6. //---------------------------------------------------------------
  7. IDXGIAdapter* adpter;//适配器
  8. IDXGIFactory* factory;
  9. IDXGIOutput* adapterOutput;
  10. unsigned int numModes, numerator, denominator, stringLength;
  11. DXGI_MODE_DESC* displayModeList;
  12. DXGI_ADAPTER_DESC adapterDesc;
  13. int error;
  14. //存储vsyn设定
  15. mVsyncEnable = vsync;
  16. //创建一个Directx图形接口factory
  17. HR(CreateDXGIFactory(__uuidof(IDXGIFactory), (void**)&factory));
  18. //使用factory来为显卡创建一个adapter
  19. HR(factory->EnumAdapters(0, &adpter));
  20. //列举主要的适配器输出
  21. HR(adpter->EnumOutputs(0, &adapterOutput));
  22. //获取适应适配器DXGI_FORMAT_R8G8B8A8_UNORM显示格式的模式数目
  23. HR(adapterOutput->GetDisplayModeList(DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_ENUM_MODES_INTERLACED, &numModes, NULL));
  24. //创建一个显示模式列表存放可能的显示模式(显卡,监视器)
  25. displayModeList= new DXGI_MODE_DESC[numModes];
  26. if (!displayModeList)
  27. return false;
  28. //填充显示模式列表结构体
  29. HR(adapterOutput->GetDisplayModeList(DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_ENUM_MODES_INTERLACED, &numModes, displayModeList));
  30. //浏览所有的显示模式,找到适合屏幕宽度和高度的
  31. //当一个模式匹配,存储监视器刷新速度的分子分母??
  32. for (int i = 0; i<numModes; i++)
  33. {
  34. if (displayModeList[i].Width == (unsigned int)ScreenWidth)
  35. {
  36. if (displayModeList[i].Height == (unsigned int)ScreenHeight)
  37. {
  38. numerator = displayModeList[i].RefreshRate.Numerator;
  39. denominator = displayModeList[i].RefreshRate.Denominator;
  40. }
  41. }
  42. }
  43. //获取适配器(显卡)形容
  44. HR(adpter->GetDesc(&adapterDesc));
  45. //获取显卡内存量
  46. mVideoCardMemory = (int)(adapterDesc.DedicatedVideoMemory / 1024 / 1024);
  47. //将显卡名字转存在字符数组
  48. error = wcstombs_s(&stringLength, mVideoCardDescription, 128, adapterDesc.Description, 128);
  49. if (error != 0)
  50. {
  51. return false;
  52. }
  53. //释放显示模式列表
  54. delete[] displayModeList;
  55. displayModeList = NULL;
  56. ReleaseCOM(adpter);
  57. ReleaseCOM(factory);
  58. //-----------------------------------------------------
  59. //第二,填充交换链形容结构体
  60. //-----------------------------------------------------
  61. DXGI_SWAP_CHAIN_DESC sd;
  62. ZeroMemory(&sd, sizeof(sd));
  63. sd.BufferDesc.Width = ScreenWidth;
  64. sd.BufferDesc.Height = ScreenHeight;
  65. sd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
  66. if (mVsyncEnable) //限不限帧
  67. {
  68. sd.BufferDesc.RefreshRate.Numerator =numerator;
  69. sd.BufferDesc.RefreshRate.Denominator = denominator;
  70. }
  71. else
  72. {
  73. sd.BufferDesc.RefreshRate.Numerator = 0;
  74. sd.BufferDesc.RefreshRate.Denominator = 1;
  75. }
  76. //关闭多重采样
  77. sd.SampleDesc.Count = 1;
  78. sd.SampleDesc.Quality = 0;
  79. //是否进行全屏
  80. if (fullscreen)
  81. {
  82. sd.Windowed = false;
  83. }
  84. else
  85. {
  86. sd.Windowed = true;
  87. }
  88. sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
  89. sd.BufferCount = 1; //背后缓存数量
  90. sd.OutputWindow = hwnd; //交换链所属的窗口
  91. sd.SwapEffect = DXGI_SWAP_EFFECT_DISCARD;
  92. sd.Flags = 0;
  93. sd.BufferDesc.ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED;
  94. sd.BufferDesc.Scaling = DXGI_MODE_SCALING_UNSPECIFIED;
  95. //---------------------------------------------------------------
  96. //第三,创建交换链和D3D设备和D3D设备上下文
  97. //---------------------------------------------------------------
  98. D3D_FEATURE_LEVEL featureLevel;
  99. featureLevel = D3D_FEATURE_LEVEL_11_0;
  100. HR(D3D11CreateDeviceAndSwapChain(NULL, D3D_DRIVER_TYPE_HARDWARE, NULL, 0, &featureLevel, 1,
  101. D3D11_SDK_VERSION, &sd, &md3dSwapChain, &md3dDevice, NULL, &md3dImmediateContext));
  102. //--------------------------------------------------------------
  103. //第四,创建背后缓存视图
  104. //--------------------------------------------------------------
  105. ID3D11Texture2D*backBuffer;
  106. md3dSwapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), reinterpret_cast<void**>(&backBuffer));
  107. md3dDevice->CreateRenderTargetView(backBuffer, 0, &md3dRenderTargetView);
  108. ReleaseCOM(backBuffer);
  109. //--------------------------------------------------------------
  110. //第五,填充2DTexture深度缓存(模板缓存)形容结构体,创建深度缓存(模板缓存)
  111. //--------------------------------------------------------------
  112. D3D11_TEXTURE2D_DESC depthStencilDesc;
  113. ZeroMemory(&depthStencilDesc, sizeof(depthStencilDesc));
  114. depthStencilDesc.Width=ScreenWidth;
  115. depthStencilDesc.Height = ScreenHeight;
  116. depthStencilDesc.MipLevels = 1;
  117. depthStencilDesc.ArraySize = 1;
  118. depthStencilDesc.Format = DXGI_FORMAT_D24_UNORM_S8_UINT;
  119. depthStencilDesc.SampleDesc.Count = 1;
  120. depthStencilDesc.SampleDesc.Quality = 0;
  121. depthStencilDesc.Usage = D3D11_USAGE_DEFAULT;
  122. depthStencilDesc.BindFlags = D3D11_BIND_DEPTH_STENCIL;
  123. depthStencilDesc.CPUAccessFlags = 0;
  124. depthStencilDesc.MiscFlags = 0;
  125. HR(md3dDevice->CreateTexture2D(&depthStencilDesc,//要创建的纹理的形容
  126. 0,
  127. &md3dDepthStencilBuffer)); //指向深度缓存的指针
  128. //-------------------------------------------------------------
  129. //第六,创建并设定深度缓存(模板缓存)状态,指示如何使用Depth和stencil(Test)
  130. //-------------------------------------------------------------
  131. D3D11_DEPTH_STENCIL_DESC DSDESC;
  132. ZeroMemory(&DSDESC, sizeof(DSDESC));
  133. DSDESC.DepthEnable = true;
  134. DSDESC.DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ALL;
  135. DSDESC.DepthFunc = D3D11_COMPARISON_LESS;
  136. DSDESC.StencilEnable = true;
  137. DSDESC.StencilReadMask = 0xff;
  138. DSDESC.StencilWriteMask = 0xff;
  139. //前面设定
  140. DSDESC.FrontFace.StencilFailOp = D3D11_STENCIL_OP_KEEP;
  141. DSDESC.FrontFace.StencilDepthFailOp = D3D11_STENCIL_OP_INCR;
  142. DSDESC.FrontFace.StencilPassOp = D3D11_STENCIL_OP_KEEP;
  143. DSDESC.FrontFace.StencilFunc = D3D11_COMPARISON_ALWAYS;
  144. //背面设定,在光栅化状态剔除背面时这个设定没用,但是依然要设定,不然无法创建深度(模板)状态
  145. DSDESC.BackFace.StencilFailOp = D3D11_STENCIL_OP_KEEP;
  146. DSDESC.BackFace.StencilDepthFailOp = D3D11_STENCIL_OP_DECR;
  147. DSDESC.BackFace.StencilPassOp = D3D11_STENCIL_OP_KEEP;
  148. DSDESC.BackFace.StencilFunc = D3D11_COMPARISON_ALWAYS;
  149. HR(md3dDevice->CreateDepthStencilState(&DSDESC, &md3dDepthStencilState));
  150. md3dImmediateContext->OMSetDepthStencilState(md3dDepthStencilState, 1);
  151. //--------------------------------------------------------------
  152. //第七,创建深度缓存(模板缓存)视图
  153. //--------------------------------------------------------------
  154. HR(md3dDevice->CreateDepthStencilView(
  155. md3dDepthStencilBuffer, //我们基于这个深度缓存/漏字板缓存创建一个视图
  156. 0,
  157. &md3dDepthStencilView));//指向深度缓存/漏字板视图的指针
  158. //-------------------------------------------------------------
  159. //第八,把那些视图绑定到输出合并阶段
  160. //-------------------------------------------------------------
  161. md3dImmediateContext->OMSetRenderTargets(1, &md3dRenderTargetView, md3dDepthStencilView);
  162. //-------------------------------------------------------------
  163. //第九,创建并设定光栅化状态,用于控制如何渲染目标(以线框还是实体模式等等)
  164. //-------------------------------------------------------------
  165. D3D11_RASTERIZER_DESC rasterDesc;
  166. rasterDesc.AntialiasedLineEnable = false;
  167. rasterDesc.CullMode = D3D11_CULL_BACK; //背面剔除
  168. rasterDesc.DepthBias = 0;
  169. rasterDesc.DepthBiasClamp = 0.0f;
  170. rasterDesc.DepthClipEnable = true; //深度裁剪开启
  171. rasterDesc.FillMode = D3D11_FILL_SOLID; //实体渲染
  172. rasterDesc.FrontCounterClockwise = false; //顺时针
  173. rasterDesc.MultisampleEnable = false;
  174. rasterDesc.ScissorEnable = false;
  175. rasterDesc.SlopeScaledDepthBias = 0.0f;
  176. HR(md3dDevice->CreateRasterizerState(&rasterDesc, &md3dRasterizerState));
  177. md3dImmediateContext->RSSetState(md3dRasterizerState);
  178. //-------------------------------------------------------------
  179. //第十,创建并设定视口
  180. //-------------------------------------------------------------
  181. D3D11_VIEWPORT viewport;
  182. viewport.Width = static_cast<float>(ScreenWidth);
  183. viewport.Height = static_cast<float>(ScreenHeight);
  184. viewport.MinDepth = 0.0f;
  185. viewport.MaxDepth = 1.0f;
  186. viewport.TopLeftX = 0.0f;
  187. viewport.TopLeftY = 0.0f;
  188. md3dImmediateContext->RSSetViewports(1, &viewport);
  189. //-------------------------------------------------------------
  190. //第十一,创建投影矩阵,初始化世界矩阵和用户接口矩阵
  191. //-------------------------------------------------------------
  192. fieldOfView = (float)XM_PI / 4.0f;
  193. screenAspect = (float)ScreenWidth / (float)ScreenHeight;
  194. //投影矩阵
  195. mProjMatrix = XMMatrixPerspectiveFovLH(fieldOfView, screenAspect, ScreenNear, ScreenDepth);
  196. //世界矩阵
  197. mWorldMatrix = XMMatrixIdentity();
  198. //2D渲染矩阵,用于变换用户接口,正交投影矩阵
  199. mOrthoMatrix = XMMatrixOrthographicLH(static_cast<float>(ScreenWidth), static_cast<float>(ScreenHeight), ScreenNear, ScreenDepth);
  200. //第十二,输出一个Text文件保存显卡的信息
  201. char CardInfo[128];
  202. int memory;
  203. GetVideoCardInfo(CardInfo, memory);
  204. ofstream os("I:/1.txt");
  205. os << "memory=" << memory << " " << " CardInfo= " << CardInfo;
  206. return true;
  207. }


四,本节教程程序得注意的地方如下:

(1)D3DClass的初始化第十二步显卡信息的文件"1.txt"输出在我的I盘上,这点大家请注意根据自己情况修改.

(2)  我用的是 xnamath.h 数学库,并非原作者的 d3dx10math.h库


五,程序的运行结果如下:



六,源代码链接如下:

  点击打开链接


声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/酷酷是懒虫/article/detail/883832
推荐阅读
相关标签
  

闽ICP备14008679号