~プログラミング~ DirectX 11で深度/ステンシルバッファを準備しよう

C++言語でDirectX 11を使ったアプリケーションを開発してみよう。

今回は深度/ステンシルバッファを作成します。

 

深度バッファとはピクセル毎の深度情報を記録しておくもので、これにより物体の前後関係を正しく表示させる事が出来ます。Zバッファなどと呼ばれたりもします。

 

ステンシルバッファは、型抜きのような事をする為に使ったりするものです。

 

DirectXの場合は、深度バッファとステンシルバッファを1つのテクスチャリソースに記録する仕組みになっています。

DirectX 9の時との違い

Dierect3D 9の時は CreateDevice に渡すパラメータに EnableAutoDepthStencil のようなものがあり、初期化時にバックバッファーと共に深度バッファも作成してくれていました。

 

Direct3D 11では、自分でテクスチャリソースを作成しレンダーターゲットへセットする必要があります。

深度/ステンシルバッファの初期化

    D3D11_TEXTURE2D_DESC txDesc;
    ZeroMemory( &txDesc, sizeof( txDesc ) );
    txDesc.Width              = rect.Width();
    txDesc.Height             = rect.Height();
    txDesc.MipLevels          = 1;
    txDesc.ArraySize          = 1;
    txDesc.Format             = DXGI_FORMAT_D24_UNORM_S8_UINT;
    txDesc.SampleDesc.Count   = 1;
    txDesc.SampleDesc.Quality = 0;
    txDesc.Usage              = D3D11_USAGE_DEFAULT;
    txDesc.BindFlags          = D3D11_BIND_DEPTH_STENCIL;
    txDesc.CPUAccessFlags     = 0;
    txDesc.MiscFlags          = 0;
    hr = m_pDevice->CreateTexture2D( &txDesc, NULL, &m_pDepthStencilTexture );
    if ( FAILED( hr ) )
        return hr;

    D3D11_DEPTH_STENCIL_VIEW_DESC dsDesc;
    ZeroMemory( &dsDesc, sizeof( dsDesc ) );        
    dsDesc.Format             = txDesc.Format;
    dsDesc.ViewDimension      = D3D11_DSV_DIMENSION_TEXTURE2D;
    dsDesc.Texture2D.MipSlice = 0;
    hr = m_pDevice->CreateDepthStencilView( m_pDepthStencilTexture, &dsDesc, &m_pDepthStencilView );
    if ( FAILED( hr ) )
        return hr;

深度ステンシル用テクスチャリソースを作成 (1~14行目)

CreateTexture2Dメソッドで深度ステンシルバッファ用のテクスチャを作成します。

作成するテクスチャのタイプをD3D11_TEXTURE2D_DESCで指定します。

 

Width,Height (3~4行目)

バックバッファーと同じサイズを指定します。

 

Format (7行目) 

深度ステンシルとして利用できるものは以下の通りです。

  • DXGI_FORMAT_D16_UNORM
  • DXGI_FORMAT_D24_UNORM_S8_UINT
  • DXGI_FORMAT_D32_FLOAT
  • DXGI_FORMAT_D32_FLOAT_S8X24_UINT

 

BindFlags (11行目)

深度ステンシルターゲットとしてバインドさせる為 D3D11_BIND_DEPTH_STENCIL を指定します。

 

深度ステンシルビューを作成 (18~23行目)

CreateDepthStencilViewメソッドでテクスチャリソースからビューを作成します。

作成するビューのタイプをD3D11_DEPTH_STENCIL_VIEW_DESCで指定します。

 

Format (20行目) 

深度ステンシルとして利用できるものは以下の通りです。

  • DXGI_FORMAT_D16_UNORM
  • DXGI_FORMAT_D24_UNORM_S8_UINT
  • DXGI_FORMAT_D32_FLOAT
  • DXGI_FORMAT_D32_FLOAT_S8X24_UINT

 

ViewDimension (21行目)

D3D11_DSV_DIMENSION_TEXTURE2D を指定します。

マルチサンプリングを使う場合は D3D11_DSV_DIMENSION_TEXTURE2DMS です。

 

レンダーターゲットにセットする

m_pImmediateContext->OMSetRenderTargets( 1, &m_pRenderTargetView, m_pDepthStencilView );
m_pImmediateContext->ClearRenderTargetView( m_pRenderTargetView, clearColor );
m_pImmediateContext->ClearDepthStencilView( m_pDepthStencilView, D3D11_CLEAR_DEPTH | D3D11_CLEAR_STENCIL, 1.0f, 0 );
 
 

OMSetRenderTargetsメソッドで深度ステンシルビューをターゲットにセットします。

さらにClearDepthStencilViewメソッドでバッファーをクリアすれば描画の準備が完了です。