Direct3D应用中的2D应用.doc
《Direct3D应用中的2D应用.doc》由会员分享,可在线阅读,更多相关《Direct3D应用中的2D应用.doc(43页珍藏版)》请在咨信网上搜索。
1、Direct3D应用中的2D应用 2D Application 收藏 (转载)2D Application这一章将讨论IDirect3DDevices9接口怎样应用到简单的两维应用程序里去。然而,接下来讨论的方法和接口的方法不仅仅只应用在两维应用程序里面。开始我们将看看IDirect3DSurface9接口,它用于存放像素数据。我们将看看怎样创建surfaces,怎样填充数据,并且执行像素拷贝操作。接下来,我们讨论IDirect3DSwapChain9接口管理back buffer集合。设备创建的时候都会携带一个默认的swap chain,但是也可以为window模式下多个视图创建新的swap
2、 chain。 再接下来,我们将讨论Presentation,Present 也是IDirect3DDevice9提供的方法。 即使Direct3D可以不使用GDI,但是他们也要处理发送到应用程序top-level窗口的消息。我们推荐使用Direct3D应用程序来处理窗口消息。DirectX 并没有提供直接方法来将GDI和Direct3D结合起来。但是,通常是在内存DC和流水线产生的结果像素数据上执行GDI操作。 最后,我们将讨论流水线的Video scan out部分以及swap chain从back buffer到front back 的过程。video scan out 电流读取数据,使
3、用cursor overlay,gamma校正以及像素数据转化成monitor的模拟信号。Pixel Surface Pixel 面是像素数据的矩形集合。像素数据的内存layout是通过D3DFORMAT定义的。在设备上使用surface有几处地方:back buffer surfaces, depth/stencil buffer surfaces,纹理层surface,render target surface 以及图片surface。Direct3D 使用IDirect3DSurface9接口表示一个surface,CreateOffscreenPlainsurface方法可以创建一个图
4、片surface,它能存在于scrath内存池,系统内存池和设备内存池。CreateDepthStencilSurface和CreateRenderTarget分别返回depth/stencil的surface和rendertarget的surface。一个plain surface可能不是3D 渲染的目标,但是你能在plain surface和其他surface之间进行数据拷贝。 HRESULT CreateOffscreenPlainSurface(UINT width, UINT height, D3DFORMAT format, D3DPOOL pool, IDirect3DSurfa
5、ce9 * result, HANDLE * unused);如果设备不支持被请求面的各式,CreateOffscreenPlainSurface将会失败,或者是系统内存里面没有足够的存储空间。使用CheckDeviceFormat可以用来预先检查设备是否支持某种格式的surface。interface IDirect3DSurface9 : IDirect3DResource9HRESULT GetContainer(REFIID container_iid, void * value);HRESULT GetDC(HDC *value);HRESULT GetDesc(D3DSURFACE
6、_DESC * value);HRESULT LockRect(D3DLOCKED_RECT *data, const RECT * locked_region,DWORD flags);HRESULT Release(HDC context);HRESULT UnlockRect(); 对于CreateOffscreenPlainSurface创建的surface,当container_iid是IID_Direct3DDevice9时,GetContainer将返回成功。GetDESC将返回D3DSURFACE_DESC结构体里面的像素数据的描述信息。typedef struct _D3DS
7、URFACE_DESCD3DFORMAT Format;D3DRESOURCETYPE Type;DWORD Usage;D3DPOOL Pool;D3DMULTISAMPLE_TYPE MultiSampleType;/与render target surface一起使用的multisamplingDWORD MultiSampleQuality;UINT Width;UINT Height; D3DSURFACE_DESC;Accessing Surface Pixel Data 为了获取surface的像素数据,我们需要使用LockRect和UnlockRect方法。当lockRect方
8、法的locked_region不为NULL的时候,就只lock住了surface的某个局部。参数flags告诉Direct3D一旦surface被锁住,数据将怎么办。Flags包括D3DLOCK_DISCARD, D3DLOCK_DONOTWAIT, D3DLOCK_NO_DIRTY_UPDATE,D3DLOCK_NOSYSLOCK, D3DLOCK_READONLY。 D3DLOCK_DISCARD通知runtime整个locked区域将只被写入而不读取。使用discard flag, runtime不会提供一份surface数据的copy给应用程序读取。不使用discard flag,ru
9、ntime可能被迫停掉所有未决的操作,然后再返回一个surface数据的copy给应用程序。注意:这个flag不能使用在子区域。 D3DLOCK_DONOTWAIT 决定当lock的时候不会阻塞住runtime,等待未决的渲染操作完成。如果lock调用已经阻塞了,它将返回D3DERR_WASSTILLDRAWING。 Direct3D为每个可管理的surface(注意这里只能是managed surface)维护一个dirty 区域表,用来最小化unlock数据的拷贝量。如果已经是使用了D3D_NO_DIRTY_UPDATE,locked区域将不会影响dirty 区域list。 使用D3DLO
10、CK_READONLY,应用程序保证对锁定区域没有任何的写操作。 D3DLOCK_NOSYSLOCK只只能应用到video memory的surfaces。为了阻止video存储资源被锁时设备lost,Direct3D获取系统critical section来阻止设备丢失。它也能阻塞操作系统的其他部分执行,这样势必会影响系统的交互和反应灵敏度。 D3DLOCK_NOSYSLOCK 禁止获取系统的critical section。 LockRect 方法返回D3DLOCKED_RECT结构体,它定义了surface的像素数据。它保证了surface数据在sanline上是连续的。 typedef
11、 struct _D3DLOCKED_RECT int pitch; /定义了相邻两个scanlines的距离。 void *pBits; /像素数据的指针。D3DLOCKED_RECT; 当遍历surface的每个像素时,pitch 和像素的大小是很重要的。像素数据的大小是跟D3DFORMAT有关。IDirect3DSurface9并没有提供方法用于从图片装载到surface,或者像素格式转换,D3DX却提供了很多这样的操作方法。Using GDI On a SurfaceGDI提供GetDC和ReleaseDC方法来操作与GDI兼容格式的surface。与GDI兼容格式包括D3DFMT_R
12、5G6B5,D3DFMT_X1R5G5B5,D3DFMT_R8G8B8和D3DFMT_X8R8G8B8。GDI device context可以使用GDI执行基于surface的渲染操作,然后立刻释放。一旦device context被创建,就会在Direct3D runtime里面建立一个lock。 这个lock保证runtime并不直接跟GDI rendering交互。因为这个lock的存在,应用程序应该尽可能快的释放GDI device context。而且, 只有device context释放以后,下面表里的方法才能调用。InterfaceMethodIDirect3DCubeTex
13、ture9LockRectIDirect3DDevice9ColorFillPresentStretchRectUpdateSurfaceUpdateTextureIDirect3DSurface9LockRectIDirect3DSwapChain9PresentIDirect3DTexture9LockRect Swap Chain 每个设备都包含一组默认的swap chains。GetNumberOfSwapChains返回设备swap chains的数目。GetSwapChain方法返回默认swap chain集合里的swap chain的接口。 默认swap chain集合的属性定义
14、在D3DPRESENT_PARAMETERS。Swap chain由1个,2个,3个back buffer surface 和一个front buffer surface。front buffer surface不能直接访问,但是它仍然参与到swap chain的presentation过程中。 当调用Present时back buffer surface显示在monitor。 exclusive 模式的设备使用它默认的back buffer。window模式的设备可以使用多个swap chain,每个都可以将渲染结果绘制它自己的窗口。exclusive模式的adapter group 设备也
15、可以渲染到多个monitor。 CreateAdditionalSwapChain创建一个基于D3DPRESENT_PARAMETERS的swap chain,然后返回一个IDirect3DSwapChain9接口。注意一个Swap chain只能包含back buffer surface而不是depth/stencil surface。 HRESULT CreateAdditionalSwapChain(D3DPRESENT_PARAMETERS * params, IDirect3DSwapChain9 * result);interface IDirect3DSwapChain9 : I
16、Unknown HRESULT GetBackBuffer(UINT buffer, D3DBACKBUFFER_TYPE kind, IDirect3DSurface9 * value); HRESULT GetDevice(IDirect3DDevice9 * value); HRESULT GetDisplayMode(D3DDISPLAYMODE * value); HRESULT GetFrontBufferData(IDirect3DSurface9 * destination); HRESULT GetPresentParameters(D3DPRESENT_PARAMETERS
17、 * value); HRESULT GetRasterStatus(D3DRASTER_STATUS * value); HRESULT Present(CONST RECT * source, CONST RECT * destination, HWND override, CONST RGNDATA * dirty_region, DWORD flags); GetBackBuffer返回一个back buffer surface的接口指针。back buffer序号以0开始,present首先显示是back buffer 0里面的内容,然后再是back buffer 1, 依此下去.。
18、 D3DBACKBUFFER_TYPE定义了back buffer的类型。DirecX 9.0c 并不支持stereo 渲染,kind只能是D3DBACKBUFFERTYPE_MONO.typedef enum _D3DBACKBUFFER_TYPE D3DBACKBUFFER_TYPE_MONO = 0, D3DBACKBUFFER_TYPE_LEFT = 1, D3DBACKBUFFER_TYPE_RIGHT = 2D3DBACKBUFFER_TYPE; Present跟device的Present方法一样,都执行同样的功能。flag的值包括D3DPRESENT_DONOTWAIT和D3D
19、PRESENT_LINEAR_CONTENT。D3DPRESENT_DONOTWAIT表示如果presentation引起应用程序阻塞,它将立刻返回D3DERR_WASSTILLDRAWING。 D3DPRESENT_LINEAR_CONTENT 告诉设备presentation时源区域像素应该从线性颜色空间转化到sRGB颜色空间。Presentation 当调用了Present后,back buffer的内容将会被复制到front buffer,video scan out 电流读取front buffer的像素把他们显示在monitor上。如果D3DCAPS9:DevCaps的D3DDEV
20、CAPS_CANRENDERAFTERFLIP被设置,present发生以后设备将继续queue渲染命令,也就是在设备与CPU之间有更多的并发,当前帧渲染的时候,下一帧已经queue。但是一个设备queue的帧数最多不能超过两帧。 #define D3DDEVCAPS_CANRENDERAFTERFLIP 0x000000800L HRESULT Present(const RECT * source_rect, const RECT* dest_rect,HWND override_window, const RGNDATA * dirty_region); Present对Swap cha
21、in的行为使用D3DPRESENT_PARAMETERS的SwapEffect定义的。 typedef enum _D3DSWAPEFFECT D3DSWAPEFFECT_DISCARD = 1, D3DSWAPEFFECT_FLIP = 2, D3DSWAPEFFECT_COPY = 3 D3DSWAPEFFECT; 在window模式下面,所有的swap effec都是通过拷贝操作实现的。使用最近时间间隔创建的swap chain并不能让monitor的垂直扫描与拷贝操作同步。拷贝操作运行在在Video scan out过程中,这样导致了artifacts,也称作图像tearing。为了避
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Direct3D 应用 中的
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【人****来】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【人****来】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。