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
- DirectX11-Sample-Tutorial01-初始化窗口-利用d3d清除窗口背景颜色
- DirectX11-Sample-Tutorial02-初始化窗口-利用d3d绘制旋转立方体
- DirectX11-Sample-Tutorial02-初始化窗口-利用d3d绘制三角面片
- 初始化D3D窗口模式
- 1_DirectX --D3D窗口初始化
- 在窗口中初始化D3D 8
- Java 增加窗口、添加窗口背景颜色
- MFC修改窗口背景颜色
- MFC改变窗口背景颜色
- MFC设置窗口背景颜色
- 设置win7窗口背景颜色
- VC中改变窗口背景颜色和控件背景颜色
- 控件背景颜色和窗口背景颜色的设置
- WTL窗口的背景颜色控制
- Windows窗口默认背景颜色设定
- 修改代码窗口背景颜色,保护眼睛!
- win8修改窗口背景颜色的方法
- eclipse windows 窗口背景颜色 保护视力
- 查看端口是否被占用
- Android 屏幕适配原则总结
- c#实现到某网站自动领金币功能
- ethtool 在 Linux 中的实现框架和应用
- 集合 179~15天
- DirectX11-Sample-Tutorial01-初始化窗口-利用d3d清除窗口背景颜色
- java运行机制
- 4.2 Distinct
- Remove Duplicates from Sorted Array II -- leetcode
- DataTable
- 在ARM版上开发的贪吃蛇
- Computer Visualization Project1 总结
- mysql里怎样循环遍历游标
- HDU 1176 免费馅饼(DP)