新书推介:《语义网技术体系》
作者:瞿裕忠,胡伟,程龚
   XML论坛     W3CHINA.ORG讨论区     计算机科学论坛     SOAChina论坛     Blog     开放翻译计划     新浪微博  
 
  • 首页
  • 登录
  • 注册
  • 软件下载
  • 资料下载
  • 核心成员
  • 帮助
  •   Add to Google

    >> 本版讨论高级C/C++编程、代码重构(Refactoring)、极限编程(XP)、泛型编程等话题
    [返回] 中文XML论坛 - 专业的XML技术讨论区计算机技术与应用『 C/C++编程思想 』 → 深度测试与alpha混合 查看新帖用户列表

      发表一个新主题  发表一个新投票  回复主题  (订阅本版) 您是本帖的第 17168 个阅读者浏览上一篇主题  刷新本主题   平板显示贴子 浏览下一篇主题
     * 贴子主题: 深度测试与alpha混合 举报  打印  推荐  IE收藏夹 
       本主题类别:     
     卷积内核 帅哥哟,离线,有人找我吗?
      
      
      威望:8
      头衔:总统
      等级:博士二年级(版主)
      文章:3942
      积分:27590
      门派:XML.ORG.CN
      注册:2004/7/21

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给卷积内核发送一个短消息 把卷积内核加入好友 查看卷积内核的个人资料 搜索卷积内核在『 C/C++编程思想 』的所有贴子 访问卷积内核的主页 引用回复这个贴子 回复这个贴子 查看卷积内核的博客楼主
    发贴心情 深度测试与alpha混合

    在绘制复杂的三维场景时,不可避免地会出现物体间的相互遮挡,在这种情况下,为了正确地绘制场景需要使用深度测试。半透明物体的绘制不同于不透明物体,Direct3D通过alpha混合实现半透明物体的绘制。深度测试可以简化复杂场景的绘制,alpha混合可以使绘制的三维场景更完整、更逼真。

    在复杂的场景中,通常有多个物体需要绘制,这些物体之间通常会存在遮挡关系,离观察点较远的物体会因为近处物体的者的遮挡而不可见或只有部分可见,Direct3D图形系统提供了深度测试功能来实现这种效果。

    深度缓冲区与深度测试

    要理解深度测试,首先需要理解深度缓冲区。深度缓冲区是Direct3D用来存储绘制到屏幕上的每个像素点的深度信息的一块内存缓冲区。当Direct3D将一个场景渲染到目标表面上时,它使用深度缓冲区来决定光栅化后各个多边形的像素的前后遮挡关系,最终决定哪个颜色值被绘制出来。也就是说,Direct3D通过比较当前绘制的像素点的深度和对应深度缓冲区的点的深度值来决定是否绘制当前像素。如果深度测试结果为TRUE,则绘制当前像素,并用当前像素点的深度来更新深度缓冲区,反之则不予绘制。通常情况下,深度缓冲区对应于屏幕大小的一块二维区域。

    对一个启用了深度缓冲区的场景进行光栅化操作时,渲染表面上的每个点都要进行深度测试。在深度测试开始时,深度缓冲区的深度值被设置为该场景可能出现的最大值,渲染表面上的颜色值被设置为背景颜色值。然后测试场景内即将绘制的每个多边形,看它是否小于存储在深度缓冲区中的深度值,如果该多边形的深度值更小,则该深度值被更新到深度缓冲区中,并将渲染表面上当前点的颜色值替换为该多边形的颜色。如果多边形在这一点的深度值更大,将继续测试列表中的下一个多边形。

    创建深度缓冲区

    若要在Direct3D图形程序中应用深度测试,首先必须在创建Direct3D渲染设备时创建深度缓冲区,示例代码如下:

    D3DPRESENT_PARAMETERS d3dpp;ZeroMemory(&d3dpp, sizeof(d3dpp));
    d3dpp.Windowed   = TRUE;d3dpp.SwapEffect   = D3DSWAPEFFECT_DISCARD;d3dpp.BackBufferFormat  = D3DFMT_UNKNOWN;d3dpp.EnableAutoDepthStencil = TRUE;                   // 表示由Direct3D创建并管理一个深度缓冲区d3dpp.AutoDepthStencilFormat = D3DFMT_D16;     // 表示深度缓冲区中每一个像素的深度值由16位的二进制数表示
    if(FAILED(g_d3d->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING,          &d3dpp, &g_device))){ return false;}

    激活深度测试

    深度缓冲区随Direct3D渲染设备创建好后,调用Direct3D渲染状态设置函数IDirect3DDevice9::SetRenderState(),将第一个参数设为D3DRS_ZENABLE,第二个参数设为TRUE,激活深度测试:

    g_device->SetRenderState(D3DRS_ZENABLE,   TRUE);

    设置深度测试函数

    接下来依然调用IDirect3DDevice9::SetRenderState()函数设置深度测试函数,第一个参数设置为D3DRS_ZFUNC:

    D3DRS_ZFUNC
    One member of the D3DCMPFUNC enumerated type. The default value is D3DCMP_LESSEQUAL. This member enables an application to accept or reject a pixel, based on its distance from the camera.
    The depth value of the pixel is compared with the depth-buffer value. If the depth value of the pixel passes the comparison function, the pixel is written.

    The depth value is written to the depth buffer only if the render state is TRUE.

    Software rasterizers and many hardware accelerators work faster if the depth test fails, because there is no need to filter and modulate the texture if the pixel is not going to be rendered.

    第二个参数设置为想要设置的深度测试函数,它属于D3DCMPFUNC枚举类型,定义如下:

    Defines the supported compare functions.

    typedef enum D3DCMPFUNC{    D3DCMP_NEVER = 1,    D3DCMP_LESS = 2,    D3DCMP_EQUAL = 3,    D3DCMP_LESSEQUAL = 4,    D3DCMP_GREATER = 5,    D3DCMP_NOTEQUAL = 6,    D3DCMP_GREATEREQUAL = 7,    D3DCMP_ALWAYS = 8,    D3DCMP_FORCE_DWORD = 0x7fffffff,} D3DCMPFUNC, *LPD3DCMPFUNC;
    Constants
    D3DCMP_NEVER
    Always fail the test.
    D3DCMP_LESS
    Accept the new pixel if its value is less than the value of the current pixel.
    D3DCMP_EQUAL
    Accept the new pixel if its value equals the value of the current pixel.
    D3DCMP_LESSEQUAL
    Accept the new pixel if its value is less than or equal to the value of the current pixel.
    D3DCMP_GREATER
    Accept the new pixel if its value is greater than the value of the current pixel.
    D3DCMP_NOTEQUAL
    Accept the new pixel if its value does not equal the value of the current pixel.
    D3DCMP_GREATEREQUAL
    Accept the new pixel if its value is greater than or equal to the value of the current pixel.
    D3DCMP_ALWAYS
    Always pass the test.
    D3DCMP_FORCE_DWORD
    Forces this enumeration to compile to 32 bits in size. Without this value, some compilers would allow this enumeration to compile to a size other than 32 bits. This value is not used.
    Remarks
    The values in this enumerated type define the supported compare functions for the D3DRS_ZFUNC, D3DRS_ALPHAFUNC, and D3DRS_STENCILFUNC render states.

    通常情况下,深度测试函数设置为D3DCMP_LESS,表示当测试点深度值小于深度缓冲区中相应值时,通过深度测试并绘制相关像素,这样没有被遮挡的物体才显示,而被遮挡的物体就不显示。示例代码如下:

    g_device->SetRenderState(D3DRS_ZFUNC, D3DCMP_LESS);

    更新深度缓冲区

    设置了深度测试函数后,还需要设置深度测试成功时对深度缓冲区如何操作,是保持原来的深度值,还是用当前像素的深度值更新对应的数值。

    D3DRS_ZWRITEENABLE
    TRUE to enable the application to write to the depth buffer. The default value is TRUE. This member enables an application to prevent the system from updating the depth buffer with new depth values. If FALSE, depth comparisons are still made according to the render state D3DRS_ZFUNC, assuming that depth buffering is taking place, but depth values are not written to the buffer.
    示例代码如下:

    g_device->SetRenderState(D3DRS_ZWRITEENABLE, TRUE);

    表示如果通过测试,则用当前像素的深度值更新深度缓冲区中对应的数值,这是最常用的设置,也是默认设置。


    [此贴子已经被作者于2009-4-27 10:25:07编辑过]

       收藏   分享  
    顶(0)
      




    ----------------------------------------------
    事业是国家的,荣誉是单位的,成绩是领导的,工资是老婆的,财产是孩子的,错误是自己的。

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2009/3/9 9:56:00
     
     GoogleAdSense
      
      
      等级:大一新生
      文章:1
      积分:50
      门派:无门无派
      院校:未填写
      注册:2007-01-01
    给Google AdSense发送一个短消息 把Google AdSense加入好友 查看Google AdSense的个人资料 搜索Google AdSense在『 C/C++编程思想 』的所有贴子 访问Google AdSense的主页 引用回复这个贴子 回复这个贴子 查看Google AdSense的博客广告
    2024/5/6 23:11:00

    本主题贴数9,分页: [1]

     *树形目录 (最近20个回帖) 顶端 
    主题:  深度测试与alpha混合(5638字) - 卷积内核,2009年3月9日
        回复:  [B]深度测试与alpha混合(5)[/B]透过那些透明度非常高的物体看其他物体,例如透过几乎完..(8947字) - 卷积内核,2009年4月27日
        回复:  源程序: #include <d3dx9.h>#pragma warning(disabl..(6331字) - 卷积内核,2009年4月27日
        回复:  [B]深度测试与alpha混合(4)[/B][B]材质alpha[/B]顶点alpha是没有..(2490字) - 卷积内核,2009年4月27日
        回复:  源程序:#include <d3dx9.h>#pragma warning(disabl..(6950字) - 卷积内核,2009年4月27日
        回复:  深度测试与alpha混合(3) alpha源混合系数通常设置为D3DBLEND_SRCALPHA..(1183字) - 卷积内核,2009年4月27日
        回复:  [B]示例程序:[/B]该示例程序模拟了直升飞机螺旋桨的半透明效果。在程序的初始化阶段,载入H..(9414字) - 卷积内核,2009年3月9日
        回复:  深度测试与alpha混合(2) 前面的一些例子中,已经遇到了alpha值的概念,如结构体D3DC..(7799字) - 卷积内核,2009年3月9日
        回复:  [B]示例程序[/B]该示例程序绘制了一个矩形和一个坦克模型,其中先绘制矩形,再绘制坦克模型,..(8669字) - 卷积内核,2009年3月9日

    W3C Contributing Supporter! W 3 C h i n a ( since 2003 ) 旗 下 站 点
    苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
    6,062.500ms