从今天开始每天写博客 ,将自己每天所学都记录下来,好了现在就开始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很多东西都不会,写博客只是监督自己,提醒自己得努力,那里写错了希望有人指出,本菜鸡必当虚心学习。(博客写的不咋的,见谅阿,没写过)
本章代码链接如下:点击打开链接