• D3D z缓存(转)


    在渲染多边形网格对象到场景中的时候,离观察者越远的对象应该越模糊,同时离观察者越近的物体应该越清楚,这就是深度排序(depth sorting)。深度排序有两种常用的方法。

    第一种方法称为画家算法(painter's algorithm)。这种方法将对象划分成不同的多边形,由后往前对这些多边形进行排序,再按照排好的顺序绘制出这些多边形。采用这种方法绘制多边形,能够确保前面的多边形总是在其后多边形之前进行绘制。

    深度排序的第二种方法称为z缓冲方法(z- buffer),它是图形硬件设备使用最多的方法。这种方法依赖于像素,每个像素都有一个z值(z值是像素距离观察者的距离)。当每个像素被写入时,渲染器首先检查是否已经存在一个z值更小的像素,如果不存在,这个像素就被绘制出来;如果存在,就跳过该像素。

    许多3D图形加速卡都有一个内置的z缓冲,这也是深度排序选择z缓冲方法的原因。在应用程序中使用z缓冲,最容易的方法就是在创建设备对象以及设置显示方式的时候初始化z缓冲,如下所示:

       D3DPRESENT_PARAMETERS d3dpp;

       ZeroMemory(
    &d3dpp, sizeof
    (d3dpp));

      d3dpp.Windowed                
    =
     TRUE;
      d3dpp.SwapEffect              
    =
     D3DSWAPEFFECT_DISCARD;
      d3dpp.BackBufferFormat        
    =
     d3ddm.Format;
      d3dpp.EnableAutoDepthStencil  
    =
     TRUE;
      d3dpp.AutoDepthStencilFormat  
    =
     D3DFMT_D16;

      
    if(FAILED(g_pD3D->
    CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, g_hWnd,
                                     D3DCREATE_SOFTWARE_VERTEXPROCESSING, 
    &d3dpp, &
    g_pD3DDevice)))
        
    return
     FALSE;
      
    // Set the rendering states

      g_pD3DDevice->SetRenderState(D3DRS_LIGHTING, FALSE);
      g_pD3DDevice
    ->SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE);


    同时在绘制每帧之前应该用IDirect3DDevice9::Clear来清除z缓存。

    // clear device back buffer
        g_d3d_device->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_RGBA(000255), 1.0f0);

    当每个像素被写入时,渲染器首先检查是否已经存在一个z值更小的像素,如果不存在,这个像素就被绘制出来;如果存在,就跳过该像素。这段话也就说明了dx中z为0.0的永远处于最前面。

  • 相关阅读:
    Nokia Lumia 800销售反馈 苹果iPhone、三星Galaxy不敌800设计
    各大网站用户数据库被爆,遭大量网友下载
    最美发明家:GPS、手机通讯网都源自她的发明
    iPhone5或明年下半年发布 配备iOS6和A6芯片
    保存文件到手机内存
    2012年十大科技趋势:NFC、语音控制与弯曲屏
    电脑报独家报道:宽带升级全国真相调查
    Android的电话拨号器
    Java程序员成长之路(接口与抽象类究竟有什么区别)
    联系人相关
  • 原文地址:https://www.cnblogs.com/wonderKK/p/2257502.html
Copyright © 2020-2023  润新知