ImageVerifierCode 换一换
格式:DOCX , 页数:12 ,大小:25.38KB ,
资源ID:17666402      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/17666402.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(Direct3D11教程1Direct3D11基础Word下载.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

Direct3D11教程1Direct3D11基础Word下载.docx

1、设置好这个描述结构体后,我们就可以调用D3D11CreateDeviceAndSwapChaing方法创建设备和交换链。代码如下:DXGI_SWAP_CHAIN_DESC sd;ZeroMemory( &sd, sizeof(sd) );sd.BufferCount = 1;sd.BufferDesc.Width = 640;sd.BufferDesc.Height = 480;sd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;sd.BufferDesc.RefreshRate.Numerator = 60;sd.BufferDesc.Refr

2、eshRate.Denominator = 1;sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;sd.OutputWindow = g_hWnd;sd.SampleDesc.Count = 1;sd.SampleDesc.Quality = 0;sd.Windowed = TRUE;if( FAILED( D3D10CreateDeviceAndSwapChain( NULL, D3D11_DRIVER_TYPE_REFERENCE, NULL,0, D3D11_SDK_VERSION, &sd, &g_pSwapChain, &g_pd3dD

3、evice, NULL, &g_pImmediateContext ) ) ) return FALSE;下一步需要创建一个渲染目标视图(render target view)。渲染目标视图是Direct3D 10中一种资源视图(resource view)。资源视图可以让一个资源绑定到图形管线的某个阶段。可以将资源视图看成C中的类型转换,C中的一块原始内存(raw memory)可以被转换为任意数据结构,我们可以将一块内存转换为整数数组,浮点数数组,结构,结构数组等。如果我们不知道原始内存的类型,那么它对我们来说用处不大。Direct3D 11的资源视图工作原理类似,例如一张2D纹理就类似于

4、一块原始内存,就是一种原始基础资源,有了这个原始资源,我们就可以创建不同的资源视图将这个纹理以不同的格式绑定到图形管线的不同阶段,而不同的格式可以是要绘制的渲染目标,接收深度信息的深度模板缓冲,或者也可以是一个纹理资源。C中的类型转换可以以不同方式使用一块内存,而在Direct3D 11中是资源视图进行类似的操作。因为我们需要将交换链中的后备缓冲绑定为一个渲染目标,所以需要创建一个渲染目标视图,这样Direct3D 11就可以在其上进行绘制了。我们首先调用GetBuffer() 方法获取后备缓冲对象。我们可以使用一个D3D11_RENDERTARGETVIEW_DESC结构体表示要创建的渲染目

5、标视图,这个结构体通常是CreateRenderTargetView方法的第二个参数。但是,在本教程中,默认的渲染目标视图就能满足需要,所以第二个参数为NULL表示使用默认的渲染目标视图。创建了渲染目标视图后,我们就可以调用OMSetRenderTargets()方法将它绑定到图形管线,这样管线的绘制输出被写到了后备缓冲中。创建并设置渲染目标视图的代码如下:/ 创建一个render target viewID3D11Texture2D *pBackBuffer;if( FAILED( g_pSwapChain-GetBuffer( 0, _uuidof( ID3D11Texture2D ),

6、(LPVOID*)&pBackBuffer ) ) )hr = g_pd3dDevice-CreateRenderTargetView( pBackBuffer, NULL, &g_pRenderTargetView );pBackBuffer-Release();if( FAILED( hr ) )g_pImmediateContext-OMSetRenderTargets( 1, &g_pRenderTargetView, NULL );最后,我们需要初始化视口(viewport)。视口剪裁空间坐标(X和Y的范围从-1到1,Z的范围从0到1)映射到渲染空间(有时又称为像素空间)。在Dire

7、ct3D 9中,如果程序没有设置视口,会创建一个与渲染目标相同大小的默认视口。在Direct3D 11中,没有默认视口,我们必须事先设定。因为我们想将整个渲染目标输出,所以设置左上点为(0, 0),宽度和高度与渲染目标相同。D3D10_VIEWPORT vp;vp.Width = (FLOAT) 640;vp.Height = (FLOAT) 480;vp.MinDepth = 0.0f;vp.MaxDepth = 1.0f;vp.TopLeftX = 0;vp.TopLeftY = 0;g_pImmediateContext -RSSetViewports( 1, &vp );修改消息循环创

8、建了窗口和Direct3D 11设备后,就做好了绘制的准备。但是在处理消息循环环节还有一个问题:我们使用的是GetMessage()获取消息,使用GetMessage()带来的问题是当没有消息可返回给应用程序时,GetMessage()会将应用程序置于“睡眠”状态。这样会导致在程序进行绘制时,当消息队列为空时,应用程序会处于等待状态。我们可以使用PeekMessage()代替GetMessage()来解决这个问题。PeekMessage()像GetMessage()一样可以接收消息,当没有消息处于等待时,PeekMessage()会立即返回给应用程序一个FALSE值而不是处于休眠状态。这样我们

9、就可以利用这段时间进行绘制的工作。修改过的消息循环的代码如下:MSG msg = 0;while( WM_QUIT != msg.message ) if( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) ) TranslateMessage( &msg ); DispatchMessage( & else Render(); / 进行绘制绘制代码绘制过程是在Render()方法中进行的。在本教程中,我们想让过程尽量简单,所以就用单色填充屏幕。在Direct3D 11中,要将一种颜色填充渲染目标的简单方法就是使用设备的ClearRenderTargetVi

10、ew()方法。我们首先定义一个包含四个浮点数的数组设置要显示的颜色,然后将这个数组传递到ClearRenderTargetView()方法中。本例中使用的是蓝色。填充了后备缓冲后,就可以调用交换链的Present()方法完成绘制。Present()负责将后备缓冲的内容显示在屏幕上。Render()方法的代码如下:void Render() / / 清除后备缓冲 float ClearColor4 = 0.0f, 0.125f, 0.6f, 1.0f ; / RGBA g_pImmediateContext-ClearRenderTargetView( g_pRenderTargetView,

11、ClearColor ); g_pSwapChain-Present( 0, 0 );完整代码/ Copyright (c) Microsoft Corporation. All rights reserved./-#include d3d11.h#include resource.h/ 全局变量HINSTANCE g_hInst = NULL;HWND g_hWnd = NULL;D3D_DRIVER_TYPE g_driverType = D3D_DRIVER_TYPE_NULL;D3D_FEATURE_LEVEL g_featureLevel = D3D_FEATURE_LEVEL_11

12、_0;ID3D11Device* g_pd3dDevice = NULL;ID3D11DeviceContext* g_pImmediateContext = NULL;IDXGISwapChain* g_pSwapChain = NULL;ID3D11RenderTargetView* g_pRenderTargetView = NULL;/ 函数声明HRESULT InitWindow( HINSTANCE hInstance, int nCmdShow );HRESULT InitDevice();void CleanupDevice();LRESULT CALLBACK WndProc

13、( HWND, UINT, WPARAM, LPARAM );void Render();/ 程序入口。初始化,并进入消息循环。空闲时间用来绘制场景。int WINAPI wWinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nCmdShow ) UNREFERENCED_PARAMETER( hPrevInstance ); UNREFERENCED_PARAMETER( lpCmdLine ); if( FAILED( InitWindow( hInstance, nCmdShow ) )

14、 ) return 0; if( FAILED( InitDevice() ) ) CleanupDevice(); / 消息循环 MSG msg = 0; while( WM_QUIT ! return ( int )msg.wParam;/ 注册窗口类并创建窗口HRESULT InitWindow( HINSTANCE hInstance, int nCmdShow ) / 注册窗口类 WNDCLASSEX wcex; wcex.cbSize = sizeof( WNDCLASSEX ); wcex.style = CS_HREDRAW | CS_VREDRAW; wcex.lpfnWnd

15、Proc = WndProc; wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hInstance = hInstance; wcex.hIcon = LoadIcon( hInstance, ( LPCTSTR )IDI_TUTORIAL1 ); wcex.hCursor = LoadCursor( NULL, IDC_ARROW ); wcex.hbrBackground = ( HBRUSH )( COLOR_WINDOW + 1 ); wcex.lpszMenuName = NULL; wcex.lpszClassName = LTutor

16、ialWindowClass; wcex.hIconSm = LoadIcon( wcex.hInstance, ( LPCTSTR )IDI_TUTORIAL1 ); if( !RegisterClassEx( &wcex ) ) return E_FAIL; / 创建窗口 g_hInst = hInstance; RECT rc = 0, 0, 640, 480 ; AdjustWindowRect( &rc, WS_OVERLAPPEDWINDOW, FALSE ); g_hWnd = CreateWindow( L, LDirect3D 11 Tutorial 1: Direct3D

17、11 Basics, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, rc.right - rc.left, rc.bottom - rc.top, NULL, NULL, hInstance, NULL );g_hWnd ) ShowWindow( g_hWnd, nCmdShow ); return S_OK;/ 每次当应用程序接收消息时调用这个方法LRESULT CALLBACK WndProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam ) PAINTSTRUCT p

18、s; HDC hdc; switch( message ) case WM_PAINT: hdc = BeginPaint( hWnd, &ps ); EndPaint( hWnd, & break; case WM_DESTROY: PostQuitMessage( 0 ); default: return DefWindowProc( hWnd, message, wParam, lParam );/ 创建Direct3D设备和交换链HRESULT InitDevice() HRESULT hr = S_OK; RECT rc; GetClientRect( g_hWnd, &rc );

19、UINT width = rc.right - rc.left; UINT height = rc.bottom - rc.top; UINT createDeviceFlags = 0;#ifdef _DEBUG createDeviceFlags |= D3D11_CREATE_DEVICE_DEBUG;#endif D3D_DRIVER_TYPE driverTypes = D3D_DRIVER_TYPE_HARDWARE, D3D_DRIVER_TYPE_WARP, D3D_DRIVER_TYPE_REFERENCE, ; UINT numDriverTypes = ARRAYSIZE

20、( driverTypes ); D3D_FEATURE_LEVEL featureLevels = D3D_FEATURE_LEVEL_11_0, D3D_FEATURE_LEVEL_10_1, D3D_FEATURE_LEVEL_10_0, UINT numFeatureLevels = ARRAYSIZE( featureLevels ); DXGI_SWAP_CHAIN_DESC sd; ZeroMemory( &sd, sizeof( sd ) ); sd.BufferCount = 1; sd.BufferDesc.Width = width; sd.BufferDesc.Heig

21、ht = height; sd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; sd.BufferDesc.RefreshRate.Numerator = 60; sd.BufferDesc.RefreshRate.Denominator = 1; sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; sd.OutputWindow = g_hWnd; sd.SampleDesc.Count = 1; sd.SampleDesc.Quality = 0; sd.Windowed = TRUE; for( UINT driverTypeIndex = 0; driverTypeIndex GetBuffer( 0, _uuidof( ID3D11Texture2D ), ( LPVOID* )&pBackBuffer ); hr = g_pd3dDevice-CreateRenderTargetView( pBackBu

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1