(2020年整理)Direct3D应用中的2D应用.pptx

上传人:摩西的****12 文档编号:132956513 上传时间:2020-05-22 格式:PPTX 页数:43 大小:102.13KB
返回 下载 相关 举报
(2020年整理)Direct3D应用中的2D应用.pptx_第1页
第1页 / 共43页
(2020年整理)Direct3D应用中的2D应用.pptx_第2页
第2页 / 共43页
(2020年整理)Direct3D应用中的2D应用.pptx_第3页
第3页 / 共43页
(2020年整理)Direct3D应用中的2D应用.pptx_第4页
第4页 / 共43页
(2020年整理)Direct3D应用中的2D应用.pptx_第5页
第5页 / 共43页
亲,该文档总共43页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《(2020年整理)Direct3D应用中的2D应用.pptx》由会员分享,可在线阅读,更多相关《(2020年整理)Direct3D应用中的2D应用.pptx(43页珍藏版)》请在金锄头文库上搜索。

1、学海无涯Direct3D应用中的2D应用 2DApplication收藏 转载 2DApplication这一章将讨论IDirect3DDevices9接口怎样应用到简单的两维应用程序里去 然而 接下来讨论的方法和接口的方法不仅仅只应用在两维应用程序里面 开始我们将看看IDirect3DSurface9接口 它用于存放像素数据 我们将看看怎样创建surfaces 怎样填充数据 并且执行像素拷贝操作 接下来 我们讨论IDirect3DSwapChain9接口管理backbuffer集合 设备创建的时候都会携带一个默认的swapchain 但是也可以为window模式下多个视图创建新的swapch

2、ain 再接下来 我们将讨论Presentation Present也是IDirect3DDevice9提供的方法 即使Direct3D可以不使用GDI 但是他们也要处理发送到应用程序top level窗口的消息 我们推荐使用Direct3D应用程序来处理窗口消息 DirectX并没有提供直接方法来将 学海无涯GDI和Direct3D结合起来 但是 通常是在内存DC和流水线产生的结果像素数据上执行GDI操作 最后 我们将讨论流水线的Videoscanout部分以及swapchain从backbuffer到frontback的过程 videoscanout电流读取数据 使用cursoroverl

3、ay gamma校正以及像素数据转化成monitor的模拟信号 PixelSurfacePixel面是像素数据的矩形集合 像素数据的内存layout是通过D3DFORMAT定义的 在设备上使用surface有几处地方 backbuffersurfaces depth stencilbuffersurfaces 纹理层surface rendertargetsurface以及图片surface Direct3D使用IDirect3DSurface9接口表示一个surface CreateOffscreenPlainsurface方法可以创建一个图片surface 它能存在于scrath内存池 系

4、统内存池和设备内存池 CreateDepthStencilSurface和CreateRenderTarget分别返回depth stencil的surface和rendertarget的surface 一个plainsurface可能不是3D渲染的目标 但是你能在plainsurface和其他surface之间进行数据拷贝 HRESULTCreateOffscreenPlainSurface UINTwidth 学海无涯 UINTheight D3DFORMATformat D3DPOOLpool IDirect3DSurface9 result HANDLE unused 如果设备不支持被

5、请求面的各式 CreateOffscreenPlainSurface将会失败 或者是系统内存里面没有足够的存储空间 使用CheckDeviceFormat可以用来预先检查设备是否支持某种格式的surface interfaceIDirect3DSurface9 IDirect3DResource9 HRESULTGetContainer REFIIDcontainer iid void value 学海无涯 HRESULTGetDC HDC value HRESULTGetDesc D3DSURFACE DESC value const HRESULTLockRect D3DLOCKED RE

6、CT data RECT locked region DWORDflags HRESULTRelease HDCcontext HRESULTUnlockRect 对于CreateOffscreenPlainSurface创建的surface 当container iid是IID Direct3DDevice9时 GetContainer将返回成功 GetDESC将返回D3DSURFACE DESC结构体里面的像素数据的描述信息 typedefstruct D3DSURFACE DESC D3DFORMATFormat 学海无涯 D3DRESOURCETYPEType DWORDUsage D

7、3DPOOLPool D3DMULTISAMPLE TYPEMultiSampleType 与rendertargetsurface一起使用的multisamplingDWORDMultiSampleQuality UINTWidth UINTHeight D3DSURFACE DESC AccessingSurfacePixelData 为了获取surface的像素数据 我们需要使用LockRect和UnlockRect方法 当lockRect方法的locked region不为 学海无涯NULL的时候 就只lock住了surface的某个局部 参数flags告诉Direct3D一旦surf

8、ace被锁住 数据将怎么办 Flags包括D3DLOCK DISCARD D3DLOCK DONOTWAIT D3DLOCK NO DIRTY UPDATE D3DLOCK NOSYSLOCK D3DLOCK READONLY D3DLOCK DISCARD通知runtime整个locked区域将只被写入而不读取 使用discardflag runtime不会提供一份surface数据的copy给应用程序读取 不使用discardflag runtime可能被迫停掉所有未决的操作 然后再返回一个surface数据的copy给应用程序 注意 这个flag不能使用在子区域 D3DLOCK DONO

9、TWAIT决定当lock的时候不会阻塞住runtime 等待未决的渲染操作完成 如果lock调用已经阻塞了 它将返回D3DERR WASSTILLDRAWING Direct3D为每个可管理的surfac e注意这里只能是managedsurface 维护一个dirty区域表 用来最小化unlock数据的拷贝量 如果已经是使用了D3D NO DIRTY UPDATE locked区域将不会影响dirty区域list 使用D3DLOCK READONLY 应用程序保证对锁定区域没有任何的写操作 D3DLOCK NOSYSLOCK只只能应用到videomemory的surfaces 为了阻止vid

10、eo存储资源被锁时设备lost Direct3D获取系统criticalsection来阻止设备丢失 它也能阻塞操作系统的其他部分执行 这样势必会影响系统的交互和反应灵敏 学海无涯度 D3DLOCK NOSYSLOCK禁止获取系统的criticalsection LockRect方法返回D3DLOCKED RECT结构体 它定义了surface的像素数据 它保证了surface数据在sanline上是连续的 typedefstruct D3DLOCKED RECT intpitch 定义了相邻两个scanlines的距离 void pBits 像素数据的指针 D3DLOCKED RECT 当遍

11、历surface的每个像素时 pitch和像素的大小是很重要的 像素数据的大小是跟D3DFORMAT有关 IDirect3DSurface9并没有提供方法用于从图片装载到surface 或者像素格式转换 D3DX却提供了很多这样的操作方法 UsingGDIOnaSurfaceGDI提供GetDC和ReleaseDC方法来操作与GDI兼容格式的surface 与GDI兼容格式包括D3DFMT R5G6B5 D3DFMT X1R5G5B5 D3DFMT R8G8B8和D3DFMT X8R8G8B8 GDIdevicecontext可以使用GDI执行基于surface的渲染操作 然后立刻释放 一旦d

12、evice 学海无涯context被创建 就会在Direct3Druntime里面建立一个lock 这个lock保证runtime并不直接跟GDIrendering交互 因为这个lock的存在 应用程序应该尽可能快的释放GDIdevicecontext 而且 只有devicecontext释放以后 下面表里的方法才能调用 InterfaceMethodIDirect3DCubeTexture9LockRectIDirect3DDevice9ColorFillPresentStretchRect 学海无涯UpdateSurface UpdateTextureIDirect3DSurface9Lo

13、ckRectIDirect3DSwapChain9PresentIDirect3DTexture9LockRect SwapChain每个设备都包含一组默认的swapchains GetNumberOfSwapChains返回设备swapchains的数目 学海无涯GetSwapChain方法返回默认swapchain集合里的swapchain的接口 默认swapchain集合的属性定义在D3DPRESENT PARAMETERS Swapchain由1个 2个 3个backbuffersurface和一个frontbuffersurface frontbuffersurface不能直接访问

14、但是它仍然参与到swapchain的presentation过程中 当调用Present时backbuffersurface显示在monitor exclusive模式的设备使用它默认的backbuffer window模式的设备可以使用多个swapchain 每个都可以将渲染结果绘制它自己的窗口 exclusive模式的adaptergroup设备也可以渲染到多个monitor CreateAdditionalSwapChain创建一个基于D3DPRESENT PARAMETERS的swapchain 然后返回一个IDirect3DSwapChain9接口 注意一个Swapchain只能包含

15、backbuffersurface而不是depth stencilsurface HRESULTCreateAdditionalSwapChain D3DPRESENT PARAMETERS params IDirect3DSwapChain9 result interfaceIDirect3DSwapChain9 IUnknown 学海无涯HRESULTGetBackBuffer UINTbuffer D3DBACKBUFFER TYPEkind IDirect3DSurface9 value HRESULTGetDevice IDirect3DDevice9 value HRESULTGe

16、tDisplayMode D3DDISPLAYMODE value HRESULTGetFrontBufferData IDirect3DSurface9 destination HRESULTGetPresentParameters D3DPRESENT PARAMETERS value GetRasterStatus D3DRASTER STATUS HRESULTvalue HRESULTPresent CONSTRECT source CONSTRECT destination HWNDoverride CONSTRGNDATA dirty region DWORDflags 学海无涯 GetBackBuffer返回一个backbuffersurface的接口指针 backbuffer序号以0开始 present首先显示是backbuffer0里面的内容 然后再是backbuffer1 依此下去 D3DBACKBUFFER TYPE定义了backbuffer的类型 DirecX9 0c并不支持stereo渲染 kind只能是D3DBACKBUFFERTYPE MONO type

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 心得体会

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号