2020年整理Direct3D应用中的2D应用.pdf

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

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

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

2、是也可以为 window 模式下多个视图创建新的 swap chain 再接下来 我们将讨论 Presentation Present 也是 IDirect3DDevice9 提供的方法 即使 Direct3D 可以不使用 GDI 但是他们也要处理发送 到应用程序 top level 窗口的消息 我们推荐使用 Direct3D 应 用程序来处理窗口消息 DirectX 并没有提供直接方法来将 学 海 无 涯 GDI 和 Direct3D 结合起来 但是 通常是在内存 DC 和流水 线产生的结果像素数据上执行 GDI 操作 最后 我们将讨论流水线的 Video scan out 部分以及 swa

3、p chain 从 back buffer 到 front back 的过程 video scan out 电 流读取数据 使用 cursor overlay gamma 校正以及像素数据转 化成 monitor 的模拟信号 Pixel Surface Pixel 面是像素数据的矩形集合 像素数据的内存 layout 是通过 D3DFORMAT 定义的 在设备上使用 surface 有几处 地方 back buffer surfaces depth stencil buffer surfaces 纹理 层surface render target surface 以及图片surface Dir

4、ect3D 使 用 IDirect3DSurface9 接口表示一个 surface CreateOffscreenPlainsurface 方法可以创建一个图片 surface 它能存在于 scrath 内存池 系统内存池和设备内存池 CreateDepthStencilSurface 和 CreateRenderTarget 分别返回 depth stencil 的 surface 和 render target的surface 一个plain surface可能不是3D 渲染的目标 但是你能在 plain surface 和其他 surface 之间进行数据拷贝 HRESULT Crea

5、teOffscreenPlainSurface UINT width 学 海 无 涯 UINT height D3DFORMAT format D3DPOOL pool IDirect3DSurface9 result HANDLE unused 如果设备不支持被请求面的各式 CreateOffscreenPlainSurface 将会失败 或者是系统内存里面 没有足够的存储空间 使用 CheckDeviceFormat 可以用来预 先检查设备是否支持某种格式的 surface interface IDirect3DSurface9 IDirect3DResource9 HRESULT Get

6、Container REFIID container iid void value 学 海 无 涯 HRESULT GetDC HDC value HRESULT GetDesc D3DSURFACE DESC value HRESULT LockRect D3DLOCKED RECT data const RECT locked region DWORD flags HRESULT Release HDC context HRESULT UnlockRect 对于 CreateOffscreenPlainSurface 创建的 surface 当 container iid 是 IID Di

7、rect3DDevice9 时 GetContainer 将返 回成功 GetDESC 将返回 D3DSURFACE DESC 结构体里面 的像素数据的描述信息 typedef struct D3DSURFACE DESC D3DFORMAT Format 学 海 无 涯 D3DRESOURCETYPE Type DWORD Usage D3DPOOL Pool D3DMULTISAMPLE TYPE MultiSampleType 与 render target surface 一起使用的 multisampling DWORD MultiSampleQuality UINT Width U

8、INT Height D3DSURFACE DESC Accessing Surface Pixel Data 为了获取 surface 的像素数据 我们需要使用 LockRect 和 UnlockRect 方法 当 lockRect 方法的 locked region 不为 学 海 无 涯 NULL 的时候 就只 lock 住了 surface 的某个局部 参数 flags 告诉 Direct3D 一旦 surface 被锁住 数据将怎么办 Flags 包 括 D3DLOCK DISCARD D3DLOCK DONOTWAIT D3DLOCK NO DIRTY UPDATE D3DLOCK

9、NOSYSLOCK D3DLOCK READONLY D3DLOCK DISCARD 通知 runtime 整个 locked 区域将只被写入而不读取 使用 discard flag runtime不会提供一份surface 数据的copy 给应用程序读 取 不使用 discard flag runtime 可能被迫停掉所有未决的操 作 然后再返回一个 surface 数据的 copy 给应用程序 注意 这个flag不能使用在子区域 D3DLOCK DONOTWAIT 决定当 lock 的时候不会阻塞住 runtime 等待未决的渲染操 作完成 如果 lock 调用已经阻塞了 它将返回 D3D

10、ERR WASSTILLDRAWING Direct3D 为每个可管 理的surface 注意这里只能是managed surface 维护一个dirty 区域表 用来最小化 unlock 数据的拷贝量 如果已经是使用 了 D3D NO DIRTY UPDATE locked 区域将不会影响 dirty 区域 list 使用 D3DLOCK READONLY 应用程序保证 对锁定区域没有任何的写操作 D3DLOCK NOSYSLOCK 只只能应用到 video memory 的 surfaces 为了阻止 video 存储资源被锁时设备 lost Direct3D 获取系统 critical

11、section 来阻止设备丢失 它也能阻塞操作系 统的其他部分执行 这样势必会影响系统的交互和反应灵敏 学 海 无 涯 度 D3DLOCK NOSYSLOCK 禁止获取系统的 critical section LockRect 方法返回 D3DLOCKED RECT 结构 体 它定义了 surface 的像素数据 它保证了 surface 数据在 sanline 上是连续的 typedef struct D3DLOCKED RECT int pitch 定义了相邻两个 scanlines 的距离 void pBits 像素数据的指针 D3DLOCKED RECT 当遍历 surface 的每个

12、像素时 pitch 和像素的大小是很重要的 像素数据的大小是跟 D3DFORMAT 有关 IDirect3DSurface9 并没有提供方法用于从图片装载到 surface 或者像素格式转换 D3DX 却提供了很多这样的操作方法 Using GDI On a SurfaceGDI提供GetDC和ReleaseDC 方法来 操作与 GDI 兼容格式的 surface 与 GDI 兼容格式包括 D3DFMT R5G6B5 D3DFMT X1R5G5B5 D3DFMT R8G8B8 和 D3DFMT X8R8G8B8 GDI device context 可以使用 GDI 执行基于 surface

13、的渲染操作 然后立刻释放 一旦 device 学 海 无 涯 context 被创建 就会在 Direct3D runtime 里面建立一个 lock 这个 lock 保证 runtime 并不直接跟 GDI rendering 交互 因为 这个 lock 的存在 应用程序应该尽可能快的释放 GDI device context 而且 只有 device context 释放以后 下面表里的 方法才能调用 Interface Method IDirect3DCubeTexture9 LockRect IDirect3DDevice9 ColorFill Present StretchRect

14、学 海 无 涯 UpdateSurface UpdateTexture IDirect3DSurface9 LockRect IDirect3DSwapChain9 Present IDirect3DTexture9 LockRect Swap Chain 每个设备都包含一组默认的 swap chains GetNumberOfSwapChains 返回设备 swap chains 的数目 学 海 无 涯 GetSwapChain 方法返回默认 swap chain 集合里的 swap chain 的接口 默认 swap chain 集合的属性定义在 D3DPRESENT PARAMETERS

15、 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 设备也

16、可以渲染到多个 monitor CreateAdditionalSwapChain 创建一个基于 D3DPRESENT PARAMETERS 的 swap chain 然后返回一个 IDirect3DSwapChain9 接口 注意一个 Swap chain 只能包含 back buffer surface 而不是 depth stencil surface HRESULT CreateAdditionalSwapChain D3DPRESENT PARAMETERS params IDirect3DSwapChain9 result interface IDirect3DSwapChain9 IUnknown 学 海 无 涯 HRESULT GetBackBuffer UINT buffer D3DBACKBUFFER TYPE kind IDirect3DSurface9 value HRESULT GetDevice IDirect3DDevice9 value HRESULT GetDisplayMode D3DDISPLAYMODE value HRESULT GetFron

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

当前位置:首页 > 办公文档 > 总结/报告

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