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

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

二,程序的结构如下:

具体在VS2015的代码:

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

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

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

D3DClass.h

#ifndef D3D_CLASS_H
#define D3D_CLASS_H
#define HR(X) {if(FAILED(X)) { MessageBox(0,L"Create Failed",0,0); return false;}}
#define ReleaseCOM(x) { if (x) { x->Release(); x = 0; } }#include<Windows.h>
#include<d3d11.h>
#include<D3Dcommon.h>  //???
#include<D3DX11.h>
#include<xnamath.h>
#include<iostream>
#include<istream>
#include<ostream>
#include<strstream>
#include<fstream>
using namespace std;class D3DClass
{
private:bool mVsyncEnable;  //是否限帧渲染int mVideoCardMemory; //显卡内存char mVideoCardDescription[128]; //显卡名字private:ID3D11Device* md3dDevice;//D3D11设备ID3D11DeviceContext* md3dImmediateContext;//D3D11设备上下文IDXGISwapChain* md3dSwapChain;//D3D交换链ID3D11RenderTargetView* md3dRenderTargetView; //D3D11渲染目标视图ID3D11DepthStencilView* md3dDepthStencilView; //D3D11深度(模板)视图ID3D11Texture2D* md3dDepthStencilBuffer; //D3D11的“DepthStencil缓存”ID3D11DepthStencilState* md3dDepthStencilState; //深度(模板)缓存状态ID3D11RasterizerState* md3dRasterizerState; //D3D的光栅化状态private:XMMATRIX mWorldMatrix;  //世界变换矩阵XMMATRIX mOrthoMatrix;; //正交矩阵??XMMATRIX mProjMatrix;  //投影矩阵public://构造,拷贝构造,析构函数D3DClass();D3DClass(const D3DClass&);~D3DClass();//D3DClass初始化函数bool Initialize(int ScreenWidth, int ScreenHeight, bool vsync, HWND hwnd, bool fullscreen, float ScreenDepth, float ScreenNear);//关闭D3DClass函数void Shutdown();//绘制场景函数void BeginScene(float red, float green, float blue, float alpha);void EndScene();//Get函数ID3D11Device* GetDevice() { return md3dDevice; }ID3D11DeviceContext* GetDeviceContext(){ return md3dImmediateContext; }XMMATRIX GetWorldMatrix() { return mWorldMatrix; }XMMATRIX GetOrthoMatrix() { return mOrthoMatrix; }XMMATRIX GetmProjMatrix() { return mProjMatrix; };void GetVideoCardInfo(char*, int&); //获取显卡信息
};
#endif // !D3D_CLASS_H

D3DClass.cpp

bool D3DClass::Initialize(int ScreenWidth, int ScreenHeight, bool vsync, HWND hwnd, bool fullscreen, float ScreenDepth, float ScreenNear)
{float fieldOfView, screenAspect;//--------------------------------------------------------------//第一,获取显示模式信息和显卡信息//---------------------------------------------------------------IDXGIAdapter* adpter;//适配器IDXGIFactory* factory;IDXGIOutput* adapterOutput;unsigned int numModes, numerator, denominator, stringLength;DXGI_MODE_DESC* displayModeList;DXGI_ADAPTER_DESC adapterDesc;int error;//存储vsyn设定mVsyncEnable = vsync;//创建一个Directx图形接口factoryHR(CreateDXGIFactory(__uuidof(IDXGIFactory), (void**)&factory));//使用factory来为显卡创建一个adapterHR(factory->EnumAdapters(0, &adpter));//列举主要的适配器输出HR(adpter->EnumOutputs(0, &adapterOutput));//获取适应适配器DXGI_FORMAT_R8G8B8A8_UNORM显示格式的模式数目HR(adapterOutput->GetDisplayModeList(DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_ENUM_MODES_INTERLACED, &numModes, NULL));//创建一个显示模式列表存放可能的显示模式(显卡,监视器)displayModeList= new DXGI_MODE_DESC[numModes];if (!displayModeList)return false;//填充显示模式列表结构体HR(adapterOutput->GetDisplayModeList(DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_ENUM_MODES_INTERLACED, &numModes, displayModeList));//浏览所有的显示模式,找到适合屏幕宽度和高度的//当一个模式匹配,存储监视器刷新速度的分子分母??for (int i = 0; i<numModes; i++){if (displayModeList[i].Width == (unsigned int)ScreenWidth){if (displayModeList[i].Height == (unsigned int)ScreenHeight){numerator = displayModeList[i].RefreshRate.Numerator;denominator = displayModeList[i].RefreshRate.Denominator;}}}//获取适配器(显卡)形容HR(adpter->GetDesc(&adapterDesc));//获取显卡内存量mVideoCardMemory = (int)(adapterDesc.DedicatedVideoMemory / 1024 / 1024);//将显卡名字转存在字符数组error = wcstombs_s(&stringLength, mVideoCardDescription, 128, adapterDesc.Description, 128);if (error != 0){return false;}//释放显示模式列表delete[] displayModeList;displayModeList = NULL;ReleaseCOM(adpter);ReleaseCOM(factory);//-----------------------------------------------------//第二,填充交换链形容结构体//-----------------------------------------------------DXGI_SWAP_CHAIN_DESC sd;ZeroMemory(&sd, sizeof(sd));sd.BufferDesc.Width = ScreenWidth;sd.BufferDesc.Height = ScreenHeight;sd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;if (mVsyncEnable) //限不限帧{sd.BufferDesc.RefreshRate.Numerator =numerator;sd.BufferDesc.RefreshRate.Denominator = denominator;}else{sd.BufferDesc.RefreshRate.Numerator = 0;sd.BufferDesc.RefreshRate.Denominator = 1;}//关闭多重采样sd.SampleDesc.Count = 1;sd.SampleDesc.Quality = 0;//是否进行全屏if (fullscreen){sd.Windowed = false;  }else{sd.Windowed = true;}sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;sd.BufferCount = 1;  //背后缓存数量sd.OutputWindow = hwnd; //交换链所属的窗口sd.SwapEffect = DXGI_SWAP_EFFECT_DISCARD;sd.Flags = 0;sd.BufferDesc.ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED;sd.BufferDesc.Scaling = DXGI_MODE_SCALING_UNSPECIFIED;//---------------------------------------------------------------//第三,创建交换链和D3D设备和D3D设备上下文//---------------------------------------------------------------D3D_FEATURE_LEVEL featureLevel;featureLevel = D3D_FEATURE_LEVEL_11_0;HR(D3D11CreateDeviceAndSwapChain(NULL, D3D_DRIVER_TYPE_HARDWARE, NULL, 0, &featureLevel, 1,D3D11_SDK_VERSION, &sd, &md3dSwapChain, &md3dDevice, NULL, &md3dImmediateContext));//--------------------------------------------------------------//第四,创建背后缓存视图//--------------------------------------------------------------ID3D11Texture2D*backBuffer;md3dSwapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), reinterpret_cast<void**>(&backBuffer));md3dDevice->CreateRenderTargetView(backBuffer, 0, &md3dRenderTargetView);ReleaseCOM(backBuffer);//--------------------------------------------------------------//第五,填充2DTexture深度缓存(模板缓存)形容结构体,创建深度缓存(模板缓存)//--------------------------------------------------------------D3D11_TEXTURE2D_DESC depthStencilDesc;ZeroMemory(&depthStencilDesc, sizeof(depthStencilDesc));depthStencilDesc.Width=ScreenWidth;depthStencilDesc.Height = ScreenHeight;depthStencilDesc.MipLevels = 1;depthStencilDesc.ArraySize = 1;depthStencilDesc.Format = DXGI_FORMAT_D24_UNORM_S8_UINT;depthStencilDesc.SampleDesc.Count = 1;depthStencilDesc.SampleDesc.Quality = 0;depthStencilDesc.Usage = D3D11_USAGE_DEFAULT;depthStencilDesc.BindFlags = D3D11_BIND_DEPTH_STENCIL;depthStencilDesc.CPUAccessFlags = 0;depthStencilDesc.MiscFlags = 0;HR(md3dDevice->CreateTexture2D(&depthStencilDesc,//要创建的纹理的形容0,&md3dDepthStencilBuffer)); //指向深度缓存的指针//-------------------------------------------------------------//第六,创建并设定深度缓存(模板缓存)状态,指示如何使用Depth和stencil(Test)//-------------------------------------------------------------D3D11_DEPTH_STENCIL_DESC DSDESC;ZeroMemory(&DSDESC, sizeof(DSDESC));DSDESC.DepthEnable = true;DSDESC.DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ALL;DSDESC.DepthFunc = D3D11_COMPARISON_LESS;DSDESC.StencilEnable = true;DSDESC.StencilReadMask = 0xff;DSDESC.StencilWriteMask = 0xff;//前面设定DSDESC.FrontFace.StencilFailOp = D3D11_STENCIL_OP_KEEP;DSDESC.FrontFace.StencilDepthFailOp = D3D11_STENCIL_OP_INCR;DSDESC.FrontFace.StencilPassOp = D3D11_STENCIL_OP_KEEP;DSDESC.FrontFace.StencilFunc = D3D11_COMPARISON_ALWAYS;//背面设定,在光栅化状态剔除背面时这个设定没用,但是依然要设定,不然无法创建深度(模板)状态DSDESC.BackFace.StencilFailOp = D3D11_STENCIL_OP_KEEP;DSDESC.BackFace.StencilDepthFailOp = D3D11_STENCIL_OP_DECR;DSDESC.BackFace.StencilPassOp = D3D11_STENCIL_OP_KEEP;DSDESC.BackFace.StencilFunc = D3D11_COMPARISON_ALWAYS;HR(md3dDevice->CreateDepthStencilState(&DSDESC, &md3dDepthStencilState));md3dImmediateContext->OMSetDepthStencilState(md3dDepthStencilState, 1);//--------------------------------------------------------------//第七,创建深度缓存(模板缓存)视图//--------------------------------------------------------------HR(md3dDevice->CreateDepthStencilView(md3dDepthStencilBuffer, //我们基于这个深度缓存/漏字板缓存创建一个视图0,&md3dDepthStencilView));//指向深度缓存/漏字板视图的指针//-------------------------------------------------------------//第八,把那些视图绑定到输出合并阶段//-------------------------------------------------------------md3dImmediateContext->OMSetRenderTargets(1, &md3dRenderTargetView, md3dDepthStencilView);//-------------------------------------------------------------//第九,创建并设定光栅化状态,用于控制如何渲染目标(以线框还是实体模式等等)//-------------------------------------------------------------D3D11_RASTERIZER_DESC rasterDesc;rasterDesc.AntialiasedLineEnable = false;rasterDesc.CullMode = D3D11_CULL_BACK; //背面剔除rasterDesc.DepthBias = 0;rasterDesc.DepthBiasClamp = 0.0f;rasterDesc.DepthClipEnable = true; //深度裁剪开启rasterDesc.FillMode = D3D11_FILL_SOLID; //实体渲染rasterDesc.FrontCounterClockwise = false; //顺时针rasterDesc.MultisampleEnable = false;rasterDesc.ScissorEnable = false;rasterDesc.SlopeScaledDepthBias = 0.0f;HR(md3dDevice->CreateRasterizerState(&rasterDesc, &md3dRasterizerState));md3dImmediateContext->RSSetState(md3dRasterizerState);//-------------------------------------------------------------//第十,创建并设定视口//-------------------------------------------------------------D3D11_VIEWPORT viewport;viewport.Width = static_cast<float>(ScreenWidth);viewport.Height = static_cast<float>(ScreenHeight);viewport.MinDepth = 0.0f;viewport.MaxDepth = 1.0f;viewport.TopLeftX = 0.0f;viewport.TopLeftY = 0.0f;md3dImmediateContext->RSSetViewports(1, &viewport);//-------------------------------------------------------------//第十一,创建投影矩阵,初始化世界矩阵和用户接口矩阵//-------------------------------------------------------------fieldOfView = (float)XM_PI / 4.0f;screenAspect = (float)ScreenWidth / (float)ScreenHeight;//投影矩阵mProjMatrix = XMMatrixPerspectiveFovLH(fieldOfView, screenAspect, ScreenNear, ScreenDepth);//世界矩阵mWorldMatrix = XMMatrixIdentity();//2D渲染矩阵,用于变换用户接口,正交投影矩阵mOrthoMatrix = XMMatrixOrthographicLH(static_cast<float>(ScreenWidth), static_cast<float>(ScreenHeight), ScreenNear, ScreenDepth);//第十二,输出一个Text文件保存显卡的信息 char CardInfo[128];int memory;GetVideoCardInfo(CardInfo, memory);ofstream os("I:/1.txt");os << "memory=" << memory << "  " << " CardInfo= " << CardInfo;return true;
}

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

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

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

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

六,源代码链接如下:

点击打开链接

Directx11基础教程二之Directx11初始化相关推荐

  1. Directx11基础教程一之Directx11框架

    首先,我已经有一定的D3D11的基础,<Introduction to 3D Game Programming with Direct3D 11>,我已经具备D3D11入门水平了,我决定用 ...

  2. java二维数组省略_Java基础教程——二维数组

    二维数组 Java里的二维数组其实是数组的数组,即每个数组元素都是一个数组. 每个数组的长度不要求一致,但最好一致. // 同样有两种风格的定义方法 int[][] _arr21_推荐 = { { 1 ...

  3. hadoop基础教程(二) MapReduce 单词统计

    1.这是hadoop基础系列教程,适合入门者学习. 2.MapReduce是一种分布式计算模型,解决海量数据问题,由两个阶段组成,map()和reduce().本文不讲解原理,下面实际操作利用MapR ...

  4. 麒麟子Javascript游戏编程零基础教程二:游戏程序员分工

    小伙子,能够走到这里,你已经不错了. 什么?你是妹子? 放心吧,入了这行,妹子也会被"汉化"的. 游戏程序员分工,以及对应的技能需求. 一.按大类划分 1.客户端程序员 负责处理客 ...

  5. 【UE5 Mass AI 基础教程二】代理移动

    紧接上文,我们开始让Agent动起来. 一.状态树 点击[鼠标右键->人工智能->StateTree],创建一个StateTree,命名为[ST_MassAI].修改Schema为Mass ...

  6. Android基础教程(二)之五大布局对象---FrameLayout,LinearLayout ,AbsoluteLayout,RelativeLayout,TableLayout.

    大家好,我们这一节讲一下Android对用五大布局对象,它们分别是FrameLayout(框架布局:不知道是不是这么翻译的),LinearLayout (线性布局),AbsoluteLayout(绝对 ...

  7. Web前端开发基础教程二

    注释和特殊字符: 如果需要在html文档添加一些便于阅读和理解但又不需要显示在页面中的注释文字,就需要使用注释标签. html中的注释以"<!--"开头,以"--& ...

  8. php与mysql基础教程第二版_PHP 和 MySQL 基础教程(二)

    本篇文章给大家带来的内容是关于PHP 和 MySQL 基础教程(二),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 数据验证 清理空格 trim 函数将清除数据头尾的空格,它的语法是 ...

  9. c语言位运算负数的实例_JavaScript基础教程(四)二进制位运算

    JavaScript基础教程二进制位运算 JavaScript中的位运算是针对二进制数据提供的运算与操作.在JavaScript标准中规定了二进制位运算时其操作数长度为32位,其最高位为符号位,因此能 ...

最新文章

  1. OpenAI教GPT-3学会上网,「全知全能」的AI模型上线了
  2. 【白话设计模式二】外观模式(Facade)
  3. 斐波那契数 c 语言实现
  4. 7-1 字母统计图 (10 分)(思路+详解)
  5. 正三角形的外接圆面积
  6. python数据处理常用函数_Python大数据处理模块Pandas
  7. C++头文件和源文件,编译过程
  8. [转载]虚拟机磁盘空间已满的发现和解决
  9. 【Nginx】第一章 快速入门
  10. go兼容java_兼容dubbo的微服务框架dubbogo;dubbo的完整go语言实现
  11. 使用动态代理爬取某房产平台信息并写入Excel(python)
  12. 抓包测试:车牌识别抓拍一体机数据平台读取不到的问题
  13. 少儿计算机基础知识,儿童计算机基本操作
  14. 在追寻梦想的路上,我们都一样
  15. EDA 电子设计自动化VHDL系列课程8 – 脉冲信号发生器
  16. 散文:dflow 是如何实现slice的
  17. 科学计算机开方符号是什么意思,计算器里开平方的符号请举来瞧瞧,好让自己购 – 手机爱问...
  18. js正则表达式获取后缀名_jquery如何获取文件后缀
  19. Python有嘻哈:Crossin教你用代码写出押韵的verse
  20. C++第三次实验:税收计算

热门文章

  1. HOOK API入门之Hook
  2. 高清电视HDTV概述(2)
  3. 怎么使用带有黑标的POS打印机
  4. c语言程序排列与组合,C语言实现排列/组合算法
  5. Go-Template模板
  6. 写完申请书,又要更新了
  7. VulnHub靶机渗透实战9-vikings
  8. vivo真机调试,无法安装应用程序 (-15)
  9. Android 打开网络上pdf文件 1
  10. 场景编程应用集锦 - 电闪雷鸣的数学联想