DirectX11-Sample-Tutorial01-初始化窗口-利用d3d清除窗口背景颜色

来源:互联网 发布:爱淘客网站源码 编辑:程序博客网 时间:2024/05/23 12:54

1)按照这里的方法配置好DirectX11

2)流程简介



>首先,要初始化窗口,用于显示图形图像。

>其次,创建图形模型(InitModel),如一个三角片,由三个顶点组成,每个顶点有对应的颜色或纹理;然后,创建着色器(InitShader),包括顶点着色器和像素着色器,用于将模型与GPU关联,将模型放入渲染管道线中处理。

>然后,利用Windows的消息循环机制,不断接收用户消息并给出响应,这里当消息队列为空时,进行图形渲染。

>最后,为防止内存泄露,要释放刚才创建的多个指针。

3)代码(main.cpp)

#include <Windows.h>#include <d3d11.h>#include <D3DX11.h>#include <tchar.h>#include "DXGI.h"#include "d3dcommon.h"#include "d3dx10math.h"//全局变量HINSTANCE g_hInstance=NULL;HWND g_hWnd=NULL;D3D_DRIVER_TYPE g_driverType=D3D_DRIVER_TYPE_NULL;//选择驱动类型D3D_FEATURE_LEVELg_featureLevel=D3D_FEATURE_LEVEL_11_0;//选择directX版本ID3D11Device* g_device=NULL;//设备ID3D11DeviceContext* g_deviceContext=NULL;//设备上下文IDXGISwapChain* g_swapChain=NULL;//交换链ID3D11RenderTargetView* g_renderTargetView=NULL;//渲染目标视图HRESULT InitWindow( HINSTANCE hInstance,int nCmdShow );//初始化窗口HRESULT InitDevice();//初始化d3d设备void ShutdownDevice();//关闭d3d设备LRESULT CALLBACK WndProc( HWND hWnd,  UINT uMsg,  WPARAM wParam,  LPARAM lParam );//窗口过程处理函数void Render();//渲染int WINAPI wWinMain( HINSTANCE hInstance, HINSTANCE hPreInstance, LPWSTR lpCmdLine, int nCmdShow ){HRESULT hResult;//int nCmdShow1=SW_SHOW;//创建窗口g_hInstance=hInstance;hResult=InitWindow( g_hInstance,SW_SHOW );if ( FAILED(hResult) ){return 0;}//初始化d3dhResult=InitDevice();if ( FAILED(hResult) ){ShutdownDevice();return 0;}//消息循环,渲染窗口MSG msg={0};while( WM_QUIT != msg.message )//点击关闭时,先发送WM_QUIT消息,然后是WM_DESTROY{if ( PeekMessage( &msg,NULL,0,0,PM_REMOVE ) ){TranslateMessage( &msg );DispatchMessage( &msg );}else{Render();}}ShutdownDevice();return ( int )msg.wParam;}//初始化窗口HRESULT InitWindow( HINSTANCE hInstance, int nCmdShow ){WNDCLASSEX wcex;wcex.cbClsExtra=0;wcex.cbSize=sizeof( wcex );wcex.cbWndExtra=0;wcex.hbrBackground=( HBRUSH )GetStockObject( BLACK_BRUSH );wcex.hCursor=LoadCursor( NULL, IDC_CROSS );wcex.hIcon=LoadIcon( NULL, IDI_WINLOGO );wcex.hIconSm=wcex.hIcon;wcex.hInstance=hInstance;wcex.lpfnWndProc=WndProc;wcex.lpszClassName=_T("DirectX-Class");wcex.lpszMenuName=NULL;wcex.style=CS_HREDRAW | CS_VREDRAW;if ( !RegisterClassEx( &wcex ) ){return E_FAIL;}RECT rc={ 0, 0, 640, 480 };AdjustWindowRect(&rc,WS_OVERLAPPEDWINDOW,FALSE);g_hWnd=CreateWindow( _T("DirectX-Class"),  _T("DirectX-Window"),  WS_OVERLAPPEDWINDOW,  CW_USEDEFAULT,  CW_USEDEFAULT,  rc.right-rc.left,  rc.bottom-rc.top,  NULL,  NULL,  hInstance,  NULL );if ( !g_hWnd ){return E_FAIL;}ShowWindow( g_hWnd, nCmdShow );return S_OK;}//初始化d3dHRESULT InitDevice(){HRESULT hResult;//获取创建窗口的矩阵,并得到窗口宽、高RECT rect;GetClientRect( g_hWnd,   &rect );UINT nScreenWidth=rect.right - rect.left;UINT nScreenHeight=rect.bottom - rect.top;//获取创建device和deviceContext所需要的参数//设备参数UINT createDeviceFlags=0;//#ifdef _DEBUG   //这段如果不注释掉 设备初始化就会失败,好像与vs版本有关,vs2012好像没问题//createDeviceFlags|= D3D11_CREATE_DEVICE_DEBUG;//#endif//驱动类型D3D_DRIVER_TYPE driverTypes[]={ D3D_DRIVER_TYPE_HARDWARE,  D3D_DRIVER_TYPE_WARP,  D3D_DRIVER_TYPE_REFERENCE };UINT nNumDriverTypes=ARRAYSIZE( driverTypes );//directX版本D3D_FEATURE_LEVEL featureLevels[]={ D3D_FEATURE_LEVEL_11_0,  D3D_FEATURE_LEVEL_10_1,  D3D_FEATURE_LEVEL_10_0 };UINT nNumFeatureLevels=ARRAYSIZE( featureLevels );//设置交换链属性DXGI_SWAP_CHAIN_DESC swapChainDesc;swapChainDesc.BufferCount=1;swapChainDesc.BufferDesc.Width=nScreenWidth;swapChainDesc.BufferDesc.Height=nScreenHeight;swapChainDesc.BufferDesc.Format=DXGI_FORMAT_R8G8B8A8_UNORM;//图像颜色空间格式swapChainDesc.BufferDesc.RefreshRate.Numerator=60;//采样帧率,分子swapChainDesc.BufferDesc.RefreshRate.Denominator=1;swapChainDesc.BufferUsage=DXGI_USAGE_RENDER_TARGET_OUTPUT;swapChainDesc.OutputWindow=g_hWnd;//输出窗口swapChainDesc.SampleDesc.Count=1;//取消多重采样swapChainDesc.SampleDesc.Quality=0;swapChainDesc.Windowed=true;//全屏or窗口swapChainDesc.BufferDesc.ScanlineOrdering=DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED;swapChainDesc.BufferDesc.Scaling=DXGI_MODE_SCALING_UNSPECIFIED;swapChainDesc.SwapEffect=DXGI_SWAP_EFFECT_DISCARD;swapChainDesc.Flags=0;//遍历所有驱动类型,选择合适的directX版本,创建device和deviceContextfor ( UINT i = 0; i<nNumDriverTypes; i++){g_driverType=driverTypes[ i ];hResult=D3D11CreateDeviceAndSwapChain( NULL,   g_driverType,   NULL,   createDeviceFlags,   featureLevels,   nNumFeatureLevels,   D3D11_SDK_VERSION,   &swapChainDesc,   &g_swapChain,//获取交换链   &g_device,//获取设备   &g_featureLevel,//获取directX版本   &g_deviceContext );//获取设备上下文if ( SUCCEEDED( hResult ) ){break;}}if ( FAILED( hResult ) ){return hResult;}//创建渲染目标视图ID3D11Texture2D* backBuffer=NULL;hResult=g_swapChain->GetBuffer( 0,__uuidof( ID3D11Texture2D ),( LPVOID* )&backBuffer );if ( FAILED( hResult ) ){return hResult;}hResult=g_device->CreateRenderTargetView( backBuffer,  NULL,  &g_renderTargetView );//将渲染视图关联到设备g_deviceContext->OMSetRenderTargets( 1, &g_renderTargetView, NULL );//创建视口D3D11_VIEWPORT vp;vp.Width=(FLOAT)nScreenWidth;vp.Height=(FLOAT)nScreenHeight;vp.MinDepth=0.0f;vp.MaxDepth=1.0f;vp.TopLeftX=0;vp.TopLeftY=0;g_deviceContext->RSSetViewports( 1, &vp );return S_OK;}LRESULT CALLBACK WndProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ){PAINTSTRUCT ps;HDC hdc;switch ( uMsg ){case WM_PAINT:{hdc=BeginPaint( hWnd, &ps );EndPaint( hWnd, &ps );break;}case WM_DESTROY:{PostQuitMessage( 0 );break;}default:{return DefWindowProc( hWnd, uMsg, wParam, lParam );}}return 0;}void Render(){float ClearColor[4]={ 0.0f,  0.125f,  0.3f,  1.0f };g_deviceContext->ClearRenderTargetView( g_renderTargetView, ClearColor );g_swapChain->Present( 0, 0 );return ;}void ShutdownDevice(){if ( g_deviceContext ){g_deviceContext->ClearState();}if ( g_renderTargetView ){g_renderTargetView->Release();g_renderTargetView=NULL;}if ( g_swapChain ){g_swapChain->Release();g_swapChain=NULL;}if ( g_deviceContext ){g_deviceContext->Release();g_deviceContext=NULL;}if ( g_device ){g_device->Release();g_device=NULL;}}

完整代码看这里。

注意,使用D3D SDK-JUN10.exe中sample里的代码直接运行时,发现窗口会消失,debug后发现原来是交换链创建失败,也就是

D3D11CreateDeviceAndSwapChain这个函数除了问题,经过函数参数排查,定位到下面代码:
<pre name="code" class="cpp">UINT createDeviceFlags=0;//#ifdef _DEBUG   //这段如果不注释掉 设备初始化就会失败,好像与vs版本有关,vs2012好像没问题//createDeviceFlags|= D3D11_CREATE_DEVICE_DEBUG;//#endif


1 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 魅族mx5返回键失灵怎么办 电信苹果3g网速慢怎么办 魅蓝6开不了机怎么办 手机应用被锁了怎么办 魅族电池不耐用怎么办 魅族mx6现在很卡怎么办 魅族e2手机屏幕背景黑色怎么办 魅族x6手机锁了怎么办 360n5返回键失灵怎么办 360n5返回键不好用怎么办 魅族手机锁屏怎么办 魅族手机锁住了怎么办 手机己锁定怎么办魅族 魅蓝u10触屏没反应怎么办 魅蓝e2手机锁定怎么办 苹果手机声音键坏了怎么办 一加6的屏幕问题怎么办 魅蓝note6卡顿怎么办 苹果4s内屏坏了怎么办 魅族mx6一直重启怎么办 魅族充电慢了怎么办啊 笔记本玩游戏掉帧怎么办 psv玩游戏掉帧怎么办 ipad玩游戏掉帧怎么办 手机玩游戏严重掉帧怎么办 苹果7p掉电快怎么办 努比亚z11手机总是开关机怎么办 努比亚手机不能保存图片怎么办 小米8拍照和努比亚怎么办 oppor7手机开不了机怎么办 vivox5m手机开不开机怎么办 步步高x7图案解锁忘记怎么办 手机机锁定怎么办魅族 衣服买完降价了怎么办 在淘宝上不发货怎么办 一加3t吃鸡卡怎么办 小米max打游戏反应慢怎么办 小米max2手机玩游戏卡怎么办 魅蓝metal开不了机怎么办 魅蓝e手机信号差怎么办 魅蓝metal手机已锁定怎么办