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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

DirectX3D SDK 基础教程一.docx

1、DirectX3D SDK 基础教程一DirectX3D SDK 基础教程(一)Direct3D 10 基础Tutorial 1: Direct3D 10 Basics概述在这第一篇教程中,我们将通过一些必要的元素去创建一个最小的 Direct3D 10 应用. 每一个 Direct3D 10 应用都必须有这些功能元素对应功能属性. 这些元素包括设置窗口和设备对象,然后在窗口中显示一种颜色。设置Direct3D 10 设备现在我们在一个只有一个空窗体的工程中, 去设置一个 Direct3D 10 设备, 如果你想去渲染任何一个3D 场景,设置3D 设备是非常必要的。我们首先要做的是去创建2个对

2、象:一个设备和 一个交互链。应用程序使用设备对象在缓冲区上执行渲染。设备也包含了去创建资源的方法。交互链对象的责任是从缓冲区中获得数据,这些数据是将被设备对象渲染并显示在显示器屏幕上。交互链对象包含两个或更多地缓冲区,主要分为前端和后端缓冲区。前端缓冲区是当前正在被显示给用户的数据,大多是设备对象渲染的材质,前端缓冲区是只读的,不能被修改。后端缓冲区是渲染目标,就是设备将要渲染的材质。一旦完成了绘画操作,这个交互链对象将显示后端缓冲区。通过交互两个缓冲区,这个后端缓冲区变成了前端缓冲区。为了创建交互链对象,我们要填写一个DXGI_SWAPCHAIN_DESC 结构体,这个结构体是我们要创建的交

3、互链的描述。 有几个字段值的我们去说一下.BackBufferUsage 是一个标志字段,告诉应用程序怎样去使用后端缓冲区。如果我们想去渲染后端缓冲区,我们就要设置 BackBufferUsage 标志为 DXGI_USAGE_RENDER_TARGET_OUTPUT.OutputWindow 字段代表窗口,交互链使用这个窗口去显示图像到屏幕上。SampleDesc 被用来打开duo重采样. 由于这个教程不做多重采样,所以SampleDesc的 Count 被设置到 1, 并且Quality被设置到 0 去关闭此功能。填好这个描述结构体后,我们就可以调用D3D10CreateDeviceAnd

4、SwapChaing 函数去创建设备和交互链对象了,代码如下所示: 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.RefreshRate.Denominator = 1;

5、 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, D3D10_DRIVER_TYPE_REFERENCE, NULL, 0, D3D10_SDK_VERSION, &sd, &g_pSwapChain, &g_pd3dDevice ) ) ) retur

6、n FALSE; 接下来我们要做的事就是创建渲染目标 view. 在Direct3D 10 中一个渲染目视图就是一种资源视图. 资源视图允许一种资源在一个指定的舞台上,被绑定到图形管道上。资源视图在C中被看作可转换的类型. 在C中,一个Raw内存块能被转换成任何一种数据类型。我们能转换内存块 到一个整形数组,一个浮点数组,一个结构体,一个结构体数组等等。如果我们不知道它的类型,raw内存块本身对我们不是很有用。Direct3D 10 的资源视图与此很相似。与raw内存块类似,一个2D 材质的实例是原始的基础资源。一旦我们有了这种资源, 我们能创建不同的资源视图,在图形管道中使用不同的格式去绑定

7、材质到不同舞台上。如作为渲染目标去渲染, 作为深度模具去接收深度信息, 或者作为材质资源。C的raw内存块允许以不同的方式使用, Direct3D 10 资源视图也是如此.我们需要去创建一个渲染目标视图,因为我们要绑定我们交互链对象的后端缓冲区作为一个渲染目标,以至于Direct3D 10 能在上面进行渲染. 我们首先调用 GetBuffer()去获得后端缓冲区对象。我们要填写描述渲染目标视图D3D10_RENDERTARGETVIEW_DESC 结构体去创建它。这个机构体通常作为第二个参数传递给CreateRenderTargetView. 然而,对于这个教程,默认的渲染目标视图就已经足够了

8、。默认的渲染目标视图能够通过传递NULL作为第二个参数去过得。一旦我们创建了默认的渲染目标视图,我们能调用OMSetRenderTargets() 绑定它到管道,以至于管道渲染器能得到写到后端缓冲区的输出。代码如下: / Create a render target view ID3D10Texture2D *pBackBuffer; if( FAILED( g_pSwapChain-GetBuffer( 0, _uuidof( ID3D10Texture2D ), (LPVOID*)&pBackBuffer ) ) ) return FALSE; hr = g_pd3dDevice-Crea

9、teRenderTargetView( pBackBuffer, NULL, &g_pRenderTargetView ); pBackBuffer-Release(); if( FAILED( hr ) ) return FALSE; g_pd3dDevice-OMSetRenderTargets( 1, &g_pRenderTargetView, NULL );Direct3D 10能够进行渲染之前,我们要做的最后一件事就是去初始化视口(viewport). 视口在坐标系中贴图去渲染目标空间,X和Y的范围从-1到1,Z轴的范围是0到1。有时称作象素空间(pixel space)。在Dire

10、ct3D 9中, 如果应用没有设置视口, 一个默认的、与渲染目标同等尺寸的视口被设置作为渲染视口。在Direct3D 10中 , 没有默认的视口被设置。因此,在你能在屏幕上看到任何东西之前,我们必须设置视口。由于我们想去使用整个渲染目标去输出,我们设置了左上角坐标为(0, 0) ,并且宽度和高度是渲染目标的尺寸,代码如下: D3D10_VIEWPORT vp; vp.Width = 640; vp.Height = 480; vp.MinDepth = 0.0f; vp.MaxDepth = 1.0f; vp.TopLeftX = 0; vp.TopLeftY = 0; g_pd3dDevic

11、e-RSSetViewports( 1, &vp );修改消息循环我们已经设置了窗口和Direct3D 10 设备, 并且我们已经渲染了。然而,我们的消息循环依然有问题:它使用 GetMessage() 去获得消息。使用GetMessage()的问题是:如果没有消息在这个应用窗口队列中, GetMessage() 阻塞并没有返回,直到一个有效的消息被获取。因此,当队列里是空时,我们的应用在GetMessage()中一直等待,我们看上去好像是渲染器在做什么事情。我们能使用PeekMessage()解决这个问题。PeekMessage() 能像 GetMessage() 那样取回消息, 但当没有消

12、息时,PeekMessage()会立刻返回,而不是阻塞。我们能利用这些时间去进行渲染。修改后的消息循环看起来像下面这样子: MSG msg = 0; while( WM_QUIT != msg.message ) if( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) ) TranslateMessage( &msg ); DispatchMessage( &msg ); else Render(); / Do some rendering 渲染渲染是在Render() 函数中做的。在这个教程中,我们将渲染最简单的场景,就是使用单一的颜色去填充屏幕。在Di

13、rect3D 10中, 使用单一颜色去填充渲染目标的一个很容易的方式是使用设备对象的ClearRenderTargetView() 方法。 我们先定义一个D3D10_COLOR结构体,它描述了我们想要去填充屏幕的颜色,然后传递给ClearRenderTargetView(). 在这个例子中, 一个 我们使用一个蓝色的渐变。一旦我们填充了后端缓冲区,我们就可以调用交互链对象的Present() 方法去完成渲染。Present()的功能是显示交互链的后端缓冲区内容到屏幕上,以至于用户能看到它。这个Render() 函数看起来像下面这样: void Render() / / Clear the ba

14、ckbuffer / float ClearColor4 = 0.0f, 0.125f, 0.6f, 1.0f ; / RGBA g_pd3dDevice-ClearRenderTargetView( g_pRenderTargetView, ClearColor ); g_pSwapChain-Present( 0, 0 ); 好,到此本章全部结束,我会尽快整理并上传下章内容,如果你觉得学习到了你想要的东西,请帮忙推荐给你的朋友或转载它,有任何问题请联系我: E-mail: *本章完整代码如下:/-/ File: Tutorial01.cpp/ DirectX3D SDK 基础教程(一)/-

15、#include #include #include #include resource.h/-/ Global Variables/-/窗体的实例句柄。HINSTANCE g_hInst = NULL;/窗口句柄HWND g_hWnd = NULL;/当使用 D3D10CreateDevice or D3D10CreateDeviceAndSwapChain 时, 一个设备驱动类型需要被指定。D3D10_DRIVER_TYPE g_driverType = D3D10_DRIVER_TYPE_NULL;/D3D设备指针ID3D10Device* g_pd3dDevice = NULL;/交互

16、链对象指针IDXGISwapChain* g_pSwapChain = NULL;/D3D渲染目标试图指针ID3D10RenderTargetView* g_pRenderTargetView = NULL;/-/ Forward declarations/-HRESULT InitWindow( HINSTANCE hInstance, int nCmdShow );HRESULT InitDevice();void CleanupDevice();LRESULT CALLBACK WndProc( HWND, UINT, WPARAM, LPARAM );void Render();/-/

17、 Entry point to the program. Initializes everything and goes into a message processing / loop. Idle time is used to render the scene./-int WINAPI wWinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nCmdShow ) UNREFERENCED_PARAMETER( hPrevInstance ); UNREFERENCED_PARAMETER(

18、lpCmdLine ); if( FAILED( InitWindow( hInstance, nCmdShow ) ) ) return 0; if( FAILED( InitDevice() ) ) CleanupDevice(); return 0; / Main message loop MSG msg = 0; while( WM_QUIT != msg.message ) if( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) ) TranslateMessage( &msg ); DispatchMessage( &msg ); else R

19、ender(); CleanupDevice(); return ( int )msg.wParam;/-/ Register class and create window/-HRESULT InitWindow( HINSTANCE hInstance, int nCmdShow ) / Register class WNDCLASSEX wcex; wcex.cbSize = sizeof( WNDCLASSEX ); wcex.style = CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc = WndProc; wcex.cbClsExtra = 0

20、; 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 = LTutorialWindowClass; wcex.hIconSm = Load

21、Icon( wcex.hInstance, ( LPCTSTR )IDI_TUTORIAL1 ); if( !RegisterClassEx( &wcex ) ) return E_FAIL; / Create window g_hInst = hInstance; RECT rc = 0, 0, 640, 480 ; AdjustWindowRect( &rc, WS_OVERLAPPEDWINDOW, FALSE ); g_hWnd = CreateWindow( LTutorialWindowClass, LDirect3D 10 Tutorial 1: Direct3D 10 Basi

22、cs, 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;/-/ Called every time the application receives a message/-LRESULT CALLBACK WndProc( HWND hWnd, UINT m

23、essage, WPARAM wParam, LPARAM lParam ) PAINTSTRUCT ps; HDC hdc; switch( message ) case WM_PAINT: hdc = BeginPaint( hWnd, &ps ); EndPaint( hWnd, &ps ); break; case WM_DESTROY: PostQuitMessage( 0 ); break; default: return DefWindowProc( hWnd, message, wParam, lParam ); return 0;/-/ Create Direct3D dev

24、ice and swap chain/-HRESULT InitDevice() HRESULT hr = S_OK; RECT rc; GetClientRect( g_hWnd, &rc ); UINT width = rc.right - rc.left; UINT height = rc.bottom - rc.top; UINT createDeviceFlags = 0;#ifdef _DEBUG createDeviceFlags |= D3D10_CREATE_DEVICE_DEBUG;#endif D3D10_DRIVER_TYPE driverTypes = D3D10_D

25、RIVER_TYPE_HARDWARE, D3D10_DRIVER_TYPE_REFERENCE, ; UINT numDriverTypes = sizeof( driverTypes ) / sizeof( driverTypes0 ); DXGI_SWAP_CHAIN_DESC sd; ZeroMemory( &sd, sizeof( sd ) ); sd.BufferCount = 1; sd.BufferDesc.Width = width; sd.BufferDesc.Height = height; sd.BufferDesc.Format = DXGI_FORMAT_R8G8B

26、8A8_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 numDriver

27、Types; driverTypeIndex+ ) g_driverType = driverTypesdriverTypeIndex; hr = D3D10CreateDeviceAndSwapChain( NULL, g_driverType, NULL, createDeviceFlags, D3D10_SDK_VERSION, &sd, &g_pSwapChain, &g_pd3dDevice ); if( SUCCEEDED( hr ) ) break; if( FAILED( hr ) ) return hr; / Create a render target view ID3D10Texture2D* pBackBuffer;

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

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