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メソッドでバッファーをクリアすれば描画の準備が完了です。
- ~プログラミング~ DirectX 11を始めよう
- ~プログラミング~ DirectX 11はDirectX 9と何が違うか その1
- ~プログラミング~ DirectX 11はDirectX 9と何が違うか その2
- ~プログラミング~ DirectX 11の初期化をしよう その1
- ~プログラミング~ DirectX 11の初期化をしよう その2
- ~プログラミング~ DirectX 11で深度/ステンシルバッファを準備しよう
- ~プログラミング~ DirectX 11でシェーダーをコンパイルしよう
- ~プログラミング~ DirectX 11で三角形を表示しよう
- ~プログラミング~ DirectX 11の頂点バッファとインデックスバッファ
- ~プログラミング~ DirectX 11で立体を表示しよう その1
- ~プログラミング~ DirectX 11で立体を表示しよう その2
- ~プログラミング~ DirectX 11で平行光源ライティング
- ~プログラミング~ DirectX 11で点光源ライティング
- ~プログラミング~ DirectX 11で拡散反射 (Diffuse reflection)
- ~プログラミング~ DirectX 11で鏡面反射 (Specular reflection)
- ~プログラミング~ DirectX 11で環境反射 (Ambient reflection)
- ~プログラミング~ DirectX 11でフォン反射モデル
- ~プログラミング~ DirectXTexライブラリを導入しよう
- ~プログラミング~ DirectX 11でテクスチャマッピング
コメントをお書きください