レンダーターゲットとブレンドステート
今回と次のパートでグラフィックスパイプラインの出力結合ステージ(英訳:Output-Merger Stage)について見ていきます。
出力結合ステージはピクセルシェーダの後に実行され、今までのステージの結果から画面に描画するか決めたり、描画先のピクセルとどのようにブレンドするかを決定するものになります。
ドキュメント: グラフィック パイプライン(日本語) Graphics Pipeline(英語)
概要
今回のパートでは出力結合ステージのレンダーターゲットとブレンドステートについて見ていきます。 対応するプロジェクトはPart07_RenderTargetAndBlendStateになります。
レンダーターゲット
レンダーターゲットはグラフィックスパイプラインの出力先となり、同時に複数設定できます。 基本的に画面を表すものなので2次元テクスチャを設定します。
シェーダ
まず、複数のレンダーターゲットに出力するシェーダを見ていきましょう。
複数のレンダーターゲットに出力際はピクセルシェーダでその出力を制御します。 SV_Target0とSV_Target1のシステムセマンティクスを指定したものが各レンダーターゲットの出力先になります。 SV_Targetの横の数字で出力先を指定し、0~7の数字が使用できます。
設定
レンダーターゲットの設定は以下のように行います。
上のID3D11DeviceContext::OMSetRenderTargets関数でレンダーターゲットを行っています。
ドキュメント:ID3D11DeviceContext::OMSetRenderTargets
(日本語)
(英語)
各引数の意味はシェーダリソースビュー等これまで出てきたものと似ており、設定するものがID3D11RenderTargetViewになっただけです。 最後の引数はID3D11DepthStencilViewに次にパートで詳しく見ていきます。
ID3D11RenderTargetViewの作成
ID3D11RenderTargetViewの作成方法ですが、これも他のビューと似ています。
ID3D11Device::CreateRenderTargetView関数で作成します。 引数に渡しているD3D11_RENDER_TARGET_VIEW_DESCの内容も他のビューの作成に使用した構造体と似ていますので説明を省略します。
ドキュメント:
ID3D11Device::CreateRenderTargetView
(日本語)
(英語)
D3D11_RENDER_TARGET_VIEW_DESC
(日本語)
(英語)
レンダーターゲットについては以上です。 説明はあっさりしていますが、現在ハイエンドゲームにおいてよく使われている遅延レンダリング(英訳: Deferred Rendering)やポストエフェクト(英訳: Post Effect)を使うときはこの機能を使っていますので、欠かすことのできないものとなっています。
ブレンドステート
ブレンドステートはピクセルシェーダで出力した値をレンダーターゲットに書き込む際、もともとあった値とどのようにブレンドするかを指定するためのものです。 ID3D11BlendStateをグラフィックスパイプラインに設定することでブレンドの方法を指定することができます。
ドキュメント: ブレンディング機能の構成(日本語) Configuring Blending Functionality(英語)
ブレンドを行う式自体はある程度固定化されています。
ブレンディングの式を変えることで透けた表現や明るさの表現など様々な画面効果を出すことができます。 こちらのサイトでブレンドステートの設定を変えることができますので簡単に確認することができます。 OpenGLを使用していますが、DX11も同じパラメータを使用できますのでそこまで問題にならないでしょう。
作成
それではID3D11BlendStateの作成の仕方について見ていきます。
上のID3D11Device::CreateBlendState関数で作成します。 D3D11_BLEND_DESCでブレンド方法を指定します。
ドキュメント:
ID3D11Device::CreateBlendState関数
(日本語)
(英語)
D3D11_BLEND_DESC
(日本語)
(英語)
各レンダーターゲットに異なるブレンディングを設定することが可能です。
D3D11_BLEND_DESCのメンバ
- AlphaToCoverageEnable
アルファトゥカバレッジ機能を使用するときはtrueを設定してください。 アルファトゥカバレッジについては以下のリンク先を参考にしてください。
ドキュメント: ブレンディング機能の構成(日本語) Configuring Blending Functionality(英語) - IndependentBlendEnable
レンダーターゲットごとに異なるブレンディングを行うか決めるフラグになります。 tureで有効化されます。 falseの場合はRenderTarget[0]の内容がすべてのレンダーターゲットで使用されます。
- RenderTarget[8]
各レンダーターゲットのブレンディングを設定するためのものです。 型はD3D11_RENDER_TARGET_BLEND_DESCになります。
ドキュメント:D3D11_RENDER_TARGET_BLEND_DESC (日本語) (英語)D3D11_RENDER_TARGET_BLEND_DESCのメンバ
- BlendEnable
ブレンディングを有効にするかのフラグ。
- SrcBlend, DestBlend
ピクセルシェーダからの出力と出力先のもともとあった値のそれぞれのRGBに掛ける値を指定するためのものになります。 Srcがもともとあった値に、Destがピクセルシェーダからの出力を表します。 どのように使われるかは上の擬似コードを参考にしてください。 指定できるものは以下のリンクを参考にしてください。
ドキュメント D3D11_BLEND(日本語) D3D11_BLEND(英語) - BlendOp
ピクセルシェーダからの出力と出力先のもともとあった値のRGBをどのように組み合わせるかを指定するものになります。 どのように使われるかは上の擬似コードを参考にしてください。 指定できるものは以下のリンクを参考にしてください。
ドキュメント D3D11_BLEND_OP(日本語) D3D11_BLEND_OP(英語) - SrcBlendAlpha, DestBlendAlpha, BlendOpAlpha
SrcBlend,DestBlend,BlendOpのアルファ成分版になります。
- RenderTargetWriteMask
書き込みマスクです。 RGBA内、書き込みたい部分のビットを立てることで書き込む値を制御できます。 値が0なら書き込みが無効になり、 D3D11_COLOR_WRITE_ENABLE_ALLを指定すればすべての成分が書き込まれます。
- BlendEnable
設定
ブレンドステートの設定は以下のようになります。
ドキュメント:ID3D11DeviceContext::OMSetBlendState (日本語) (英語)
ID3D11DeviceContext::OMSetBlendStateの引数一部
- 第2引数:BlendFactor
SrcBlend, DestBlendなどにD3D11_BLEND_BLEND_FACTORを使用した時のブレンディング係数になります。
- 第3引数:SampleMask
マルチサンプリングを設定されているレンダーターゲットを使用している時の書くサンプリングのマスク値になります。
ブレンドステートについては以上になります。 ブレンドステートを使う場合はシェーダ側で特別な対応する必要はありません。 なので、同じシェーダに設定が異なるブレンドステートを設定することが可能です。
まとめ
今回、出力結合ステージのレンダーターゲットとブレンドステートについて見てきました。 レンダーターゲットは応用範囲が広い機能になり、ブレンドステートはパーティクルや半透明表現に使われるものになります。
グラフィックパイプラインにはブレンドステートのようにGPU側で処理を行うものがあります。 グラフィックスパイプラインはコンピュートシェーダのように全てこちらで制御することはできませんが、 ブレンドステートなどの機能がありますので活用していきましょう。
補足
ID3D11RenderTargetViewのクリア関数
レンダーターゲットを表すID3D11RenderTargetViewには専用のクリア関数が用意されています。
ドキュメント:ID3D11DeviceContext::ClearRenderTargetView
日本語
英語
クリアに使用する値はリソースのフォーマットにかかわらずfloatになりますので注意してください。
<前 | トップ | 次> |