DirectX 3D_基础之表面 多重采样 内存池 交互链 页面置换 深度缓存

           每日一语:

 

           人很奇怪,人就是一个矛盾体,经常会被这样那样的事情烦恼,有时候是嫉妒别人,有时候是感叹自己,为什么自己不是那样,而是这样,也许这就是人生的独特之处吧,有时候,自己在想,有时候想家里人在想什么了,我儿子又在想什么了,人都是有思想的,每个都在想,每个人都在过自己的人生,短短数十年,应该精彩的活着。人生难免起起落落,仍然要坚强的生活。

 

           正文:


                    好长时间都已经预备了Direct3D的学习,一直没有时间,万事开头难,心想只要开了头,也就开始了,后面就是坚持和毅力了。
          Direct3D众所周知,是微软支持了3D显示相关的一组API。这一篇,我们介绍相关的预备知识,后续还会经常更新这一章。


                     表面:

 

           表面是Direct3D主要用于存储2D图像数据的一个像素矩阵,注意,虽然我们可以将表面存储的数据视为一个矩阵,但像素数据实际存储在一个线性数据中。


          多重采样:

 

          用像素矩阵表示图像时往往会出现块状效应,多重采样便是一项用于平滑块状图像的技术。
          D3DMULTISAMPLE_TYPE枚举类型包含了一系列枚举常量值,用于表示对表面进行多重采样的级别,这些值包括:
          D3DMULTISAMPLE_NONE: 禁用多重采样
          D3DMULTISAMPLE_1_SAMPLE....D3DMULTISAMPLE_16_SAMPLE, 指定了从1-16级的多重采样。
          另外还有一个于特定多重采样类型相关的质量水平,该水平值用DWORD类型表示,注意,多重采样会显著降低应用程序的运行速度。
         

          内存池:

 

          表面和其他的Direct3D资源可以放入许多类型的内存池中。内存池的类型用D3DPOOL枚举类型表示。可用的内存池包括:
         D3DPOOL_DEFAULT:默认值,该类型的内存池指示Direct3D将资源放入最适合该资源类型极其适用方式的存储区中。该存储区可能是显存,AGP存储区或系统存储区。注意,调用IDirect3DDevice9::Reset之前,必须对默认内存池中的资源销毁或释放。上述函数调用后,还必须对内存池中的资源重新初始化。
         D3DPOOL_MANAGE:放入该托管内存池中的资源交由Direct3D管理(即资源将根据需要被设备自动转移到显存或AGP存储区中)。此外,这些资源将在系统存储区中保留一个备份。这样,必要时,Direct3D会将这些资源自动更新到显存中。
        D3DPOOL_SYSTEMMEM:指定将资源放入系统存储区中。
        D3DPOOL_SCRATCH:指定将资源放入系统存储区中。不同于D3DPOOL_SYSTEMMEM,这些资源不受图形设备的制约。所以,设备无法访问该类型内存池中的资源。但这些资源之间可互相复制。

 

        交换链和页面置换:

 

        Direct3D维护着一个表面集合,该集合通常由两到三个表面组成,称为交换链。该集合用接口IDirect3DSwapChain9来表示。

     交换链和页面置换技术主要用于生成更加平滑的动画。


     位于前台缓存槽中的表面对应于当前在显示器中显示的图像。显示器,并不是立即显示由前端缓存所表示的图像,例如,当显示器刷新频率为60HZ时,显示一帧图像需要1/60秒。应用程序的帧频经常与显示器的刷新频率不同步(例如,应用程序绘制一帧图像的速度可能要快于显示器显示一帧图像的速度)。但是知道当前帧在显示器中显示完毕后,才将前台缓存中的内容更新为下一帧。与此同时,在显示器显示前台缓存内容期间,我们也不想停止应用程序的绘制。所以我们将下一帧的内容绘制到一个离屏表面,也就是后台缓存中。这样,当显示器将前台缓存中的内容显示完毕后,我们将其置换到交换链的末端,并将交换链中的下一个后台缓存提升为前台缓存。这个过程称为提交,所以,完成绘制功能的程序结构为:


        1,在后台缓存中进行绘制。


                2,提交后台缓存的内容。


        3,回到步骤1.


       深度缓存:

 

      深度缓存是一个只含有特定像素的深度信息而不含图像数据的表面。深度缓存为最终绘制的图像中的每一个像素都保留了一个深度项。所以,当绘制的图像的分辨率为640X800,深度缓存中有640X800个深度项。


     前面物体部分遮挡位于其后的物体,Direct3D为了判定某一个物体的哪些像素位于另一个物体之前。使用了一项称为深度缓存或z-缓存的技术。


     深度缓存用于计算每个像素的深度值,并进行深度测试。深度测试的基本内容是依据深度值让处于同一位置的不同像素进行竞争。以选出应写入该位置的像素。距离摄像机最近的像素获胜,并被写入深度缓存的相应位置。


     深度缓存的格式决定了深度测试的精度。24位的深度缓存要比16位的深度缓存精确得多。


 

     D3DFMT_D32:32位深度缓存。
     D3DFMT_D24S8:24位深度缓存,其中8位保留供模板缓存使用。
     D3DFMT_D24X8:仅指定24位深度缓冲。
     D3DFMT_X4S4:指定24位深度缓存,其中4位保留供模板缓存使用。
     D3DFMT_D16:仅指定16位深度缓存。


     未完待续。。。

    

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值