Directx11 初始化

     从今天开始每天写博客 ,将自己每天所学都记录下来,好了现在就开始Directx11的学习.....

     学习Directx11第一步当然是初始化了,我总结了下一共包含以下几个步骤:

      1:设备的枚举

      2:创建交换连以及directx设备

      3:创建渲染目标视图 以及邦定到特定流水线

      4:视口的设置

     5:渲染

大概就这几步 ,好了开始正文了

     设备的枚举:

        驱动类型枚举:      

<span style="font-size:18px;color:#006600;">D3D_DRIVER_TYPE drivertypes[] =
	{
		D3D_DRIVER_TYPE_HARDWARE,//硬件加速
		D3D_DRIVER_TYPE_WARP,
		D3D_DRIVER_TYPE_REFERENCE,//参考层 
		D3D_DRIVER_TYPE_SOFTWARE//软件
	};</span>
<span style="font-size:24px;">   <span style="color:#000099;"> 特征级别枚举:</span></span><span style="font-size:18px;">	</span>
<span style="font-size:18px;color:#006600;">D3D_FEATURE_LEVEL    featurelevels[] =
	{
		D3D_FEATURE_LEVEL_11_0,
		D3D_FEATURE_LEVEL_10_1,
		D3D_FEATURE_LEVEL_10_0
	};</span>
  <span style="font-size:24px;color:#ff0000;"> 创建交换连以及Directx设备:</span>
    <span style="font-size:18px;">  <span style="color:#000099;">第一步填充DXGI_SWAP_CHAIN_DESC结构体:msdn中该结构体定义为:</span></span>
 <span style="font-size:18px;color:#006600;">struct DXGI_SWAP_CHAIN_DESC {
  DXGI_MODE_DESC   BufferDesc;//缓冲区说明
  DXGI_SAMPLE_DESC SampleDesc;//采样说明
  DXGI_USAGE       BufferUsage;//用途
  UINT             BufferCount;//缓冲区的个数
  HWND             OutputWindow;//输出窗口句柄
  BOOL             Windowed;//是否窗口化 
  DXGI_SWAP_EFFECT SwapEffect;//交换连效果
  UINT             Flags;//特征
} DXGI_SWAP_CHAIN_DESC;</span>

具体填充代码为:

      <span style="font-size:18px;">   RECT rect;//或得窗体的高度以及宽度
	GetClientRect(hwnd, &rect);//
	UINT width = rect.right - rect.left;//
	UINT height = rect.bottom - rect.top;//
	//结构体的填充
	DXGI_SWAP_CHAIN_DESC   swapDesc;
	ZeroMemory(&swapDesc, sizeof(swapDesc));
	swapDesc.BufferCount = 1;
	swapDesc.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
	swapDesc.BufferDesc.Height = height;
	swapDesc.BufferDesc.RefreshRate.Denominator = 1;//刷新率
	swapDesc.BufferDesc.RefreshRate.Numerator = 60;
	swapDesc.BufferDesc.Width = width;
	swapDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
	swapDesc.OutputWindow = hwnd;
	swapDesc.SampleDesc.Count = 1;//禁用多重采样
	swapDesc.SampleDesc.Quality = 0;</span>
	  <span style="font-size:18px;">swapDesc.Windowed = true;
</span>

第二步就是交换链以及Directx 设备的创建了用到了D3D11CreateDeviceAndSwapChain函数 ,函数定义如下:

<span style="font-size:18px;">HRESULT D3D11CreateDeviceAndSwapChain(
  _In_   IDXGIAdapter *pAdapter,//适配器取空即可
  _In_   D3D_DRIVER_TYPE DriverType,//驱动类型
  _In_   HMODULE Software,//取空
  _In_   UINT Flags,//标志
  _In_   const D3D_FEATURE_LEVEL *pFeatureLevels,//特征级别
  _In_   UINT FeatureLevels,//特征级别的数量
  _In_   UINT SDKVersion,//所用SDK版本
  _In_   const DXGI_SWAP_CHAIN_DESC *pSwapChainDesc,//所创建的结构体
  _Out_  IDXGISwapChain **ppSwapChain,//交换连
  _Out_  ID3D11Device **ppDevice,//D3D 设备
  _Out_  D3D_FEATURE_LEVEL *pFeatureLevel,//特征级别
  _Out_  ID3D11DeviceContext **ppImmediateContext//立即上下文设备
);
</span>
创建代码如下:

<span style="font-size:18px;">unsigned int creationflags = 0;
#ifdef _DEBUG
	creationflags|= D3D11_CREATE_DEVICE_DEBUG;
#endif
	 HRESULT hr;
	 unsigned int driver = 0;
	 for (driver = 0; driver < totalDriverTypes; driver++)
	 {
		 g_driverType = drivertypes[driver];
		 hr = D3D11CreateDeviceAndSwapChain(0, drivertypes[driver], 0,
			 creationflags, featurelevels, totalFeatureLevels, D3D11_SDK_VERSION,
			 &swapDesc, &g_swapChian, &g_d3d11Device, &g_featureLevel, &g_d3d11DeviceContext);
		 if (SUCCEEDED(hr))//判断是否创建成功
		 {
			 g_driverType = drivertypes[driver];
			 break;
		 }
	 }</span>

第三步就是创建渲染目标视图并且绑定到相应的流水线中,DX11种资源不是直接绑定到流水线中的,而是以视图的形式绑定的。创建视图用到下面的函数:
HRESULT CreateRenderTargetView(
  [in]   ID3D11Resource *pResource,//D3D资源
  [in]   const D3D11_RENDER_TARGET_VIEW_DESC *pDesc,//为NULL
  [out]  ID3D11RenderTargetView **ppRTView//渲染目标视图
);

代码如下:

<span style="color:#ff0000;">         </span>ID3D11Texture2D *backBufferTexture = NULL;
	 hr = g_swapChian->GetBuffer(0, _uuidof(ID3D11Texture2D), (LPVOID*)&backBufferTexture);
	 if (FAILED(hr))
	 {
		 MessageBox(NULL, L"shibail", 0, 0);
		 return E_FAIL;
	 }
	 hr = g_d3d11Device->CreateRenderTargetView(backBufferTexture, 0, &g_renderTargerView);
	 if (FAILED(hr))
	 {
		 MessageBox(NULL, L"shibai2", 0, 0);
		 return E_FAIL;
	 }
	 g_d3d11DeviceContext->OMSetRenderTargets(1, &g_renderTargerView,0);

第四步视口的创建,DX11不同与DX9,视口是需要动手设置的没有默认的
       视口结构体如下:

typedef struct D3D11_VIEWPORT {
  FLOAT TopLeftX;//左上方X坐标
  FLOAT TopLeftY;//左上方Y坐标
  FLOAT Width;//视口宽度
  FLOAT Height;//高度
  FLOAT MinDepth;//最小深度
  FLOAT MaxDepth;//最大深度[0~1]
} D3D11_VIEWPORT;
代码如下

<span style="font-size:18px;">D3D11_VIEWPORT viewPort;
	 viewPort.Width = static_cast<float>(width);
	 viewPort.Height = static_cast<float>(height);
	 viewPort.MaxDepth = 1.0f;
	 viewPort.MinDepth = 0.0f;
	 viewPort.TopLeftX = 0.0f;
	 viewPort.TopLeftY = 0.0f;
	 g_d3d11DeviceContext->RSSetViewports(1, &viewPort);</span>

最后一步就是渲染了, DX11初始化工作已经完成,现在需要的是以窗口呈现出来:

代码如下


<span style="font-size:18px;">if (g_d3d11DeviceContext == 0)
		return;
	float fColor[4] = { 0.0f, 0.0f, 1.0f, 1.0f };//背景颜色值的设置
	g_d3d11DeviceContext->ClearRenderTargetView(g_renderTargerView, fColor);//清屏
	g_swapChian->Present(0, 0);//页面翻转
</span>

好了DX11的初始化工作已经完成了,来看看截图吧:

 
 

由于本人初涉DX很多东西都不会,写博客只是监督自己,提醒自己得努力,那里写错了希望有人指出,本菜鸡必当虚心学习。(博客写的不咋的,见谅阿,没写过)

本章代码链接如下:点击打开链接


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值