天天看點

DirectX backface culling(背面剔除)

先看一下什麼是backface,有backface必然就有frontface,在DX中,frontface是這樣定義的,按照頂點定義的先後順序,呈順時針排列的頂點構成的三角形是frontface(以view space為參考),與frontface相對的面則是backface,如下圖所示。

DirectX backface culling(背面剔除)

可見決定frontface的因素有兩個

  1. 頂點定義的先後順序
  2. 頂點的排列方向-順時針或者逆時針(由頂點的位置坐标決定)

先看第一條,如果頂點的位置不變,但是定義順序變了,可能導緻frontface變成backface,如下圖

DirectX backface culling(背面剔除)

再看第二條,如果頂點的定義順序不變,但是位置變了,也可能導緻frontface變成backface,如下圖

DirectX backface culling(背面剔除)

通常backface都是不可見的,為了提高渲染速度,DX允許使用者對backface進行剔除,有三種剔除方法

  • D3DCULL_NONE - 不進行任何剔除
  • D3DCULL_CW  - 按順時針方向進行剔除
  • D3DCULL_CCW - 按逆時針方向進行剔除

其中D3DCULL_CCW是DX的預設剔除方式

該上代碼了,下面的代碼定義6個頂點,一共可以畫兩個三角形,我們看一下各種剔除方式是如何工作的。由于頂點數目不多,這裡不使用IndexBuffer,直接用VertexBuffer操作,為了友善,這裡采用D3DFVF_XYZRHW | D3DFVF_DIFFUSE格式的頂點,省去Transform和Lighting操作

代碼

ScreenVertex Vertices[] 
    =
    
{
    { 
    50.0f
    , 
    100.0f
    , 
    0.0f
    , 
    1.0f
    , 
    0xffff0000
    }, 
    //
     0
    

        {
    100.0f
    ,  
    50.0f
    , 
    0.0f
    , 
    1.0f
    , 
    0xffff0000
    }, 
    //
     1
    

        {
    150.0f
    , 
    100.0f
    , 
    0.0f
    , 
    1.0f
    , 
    0xffff0000
    }, 
    //
     2
    

        {
    200.0f
    ,  
    50.0f
    , 
    0.0f
    , 
    1.0f
    , 
    0xffff0000
    }, 
    //
     3
    

        {
    250.0f
    , 
    100.0f
    , 
    0.0f
    , 
    1.0f
    , 
    0xffff0000
    }, 
    //
     4
    

        {
    300.0f
    ,  
    50.0f
    , 
    0.0f
    , 
    1.0f
    , 
    0xffff0000
    }, 
    //
     5
    

    };

         
DirectX backface culling(背面剔除)

剔除方式1 - D3DCULL_NONE

不做任何剔除,是以兩個三角形都顯示

g_pd3dDevice
   ->
   SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE) ;
        
DirectX backface culling(背面剔除)

剔除方式2 - D3DCULL_CW

順時針剔除,由于v0,v1,v2是順時針排列,故第一個三角形被剔除,隻顯示第二個

g_pd3dDevice
   ->
   SetRenderState(D3DRS_CULLMODE, D3DCULL_CW) ;
        
DirectX backface culling(背面剔除)

剔除方式3 - D3DCULL_CCW

逆時針剔除,由于v3,v4,v5是逆時針排列,故第二個三角形被剔除,隻顯示第一個

g_pd3dDevice
   ->
   SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW) ;
        
DirectX backface culling(背面剔除)

不指定剔除方式,結果同D3DCULL_CCW,因為D3DCULL_CCW是預設的剔除方式。

如果深入下去的話,backface culling 還與Transform以及coordinates相關,有時間再讨論,比如視點的位置也可能影響culling的方向,我們上面讨論的都是假定視點在Z軸負方向,視線朝向Z軸正方向的,如果視點在Z軸正方向,視線指向Z軸負方向,那麼剔出的方向就正好反過來,即原來的順時針剔除變成逆時針剔除了。

TrangleStrip——三角形帶是一系列相連的三角形,每兩個相鄰的三角形共享兩個頂點。剔除模式會自動翻轉所有偶數個三角形(flipped on all even-numbered triangles),因為相鄰的三角形共享兩個頂點,他們會被翻到反方向。這也是複雜的3D對象使用的最多的圖元類型。

繼續閱讀