フォト

Google AdSense

  • AdSense
無料ブログはココログ

« 猫写真 | トップページ | mixi退会してみた »

2013.05.21

RenderTargetViewがNULLの時はピクセルシェーダでSV_Targetに出力しないメモ

IE 10を入れるとD3D11のランタイムが変わるという話は依然したけども、ランタイムが変わることで今まで動いていたコードで今まで出てこなかった警告を吐き出すようになったということがありました。

今回は、"D3D11 WARNING: ID3D11DeviceContext::DrawIndexed: The Pixel Shader expects a Render Target View bound to slot 0, but none is bound. "ではじまるもので、たまたまAMDのForwardPlus11で出るようになりました。

http://developer.amd.com/tools-and-sdks/graphics-development/amd-radeon-sdk/

色々と調べているとDepth Prepassの時にテクスチャのα成分を使う場合のシェーダの描画のDrawIndexedで警告が出ていました。

Depth Prepassではタイルベースカリングのために深度バッファに事前に深度を記録しておく訳ですが、テクスチャのα値を使用する場合にたとえば、そのテクスチャのαが0だったら深度を描きこまないようにしたいのでピクセルシェーダでdiscardをしているのですが、そのシェーダが問題になっているようでした。

どうやらレンダーターゲットのセット時に、レンダーターゲットビューがNULLで深度ステンシルビューはセットされているような時に、ピクセルシェーダでSV_Targetを指定するとSV_Targetの出力先が無いので警告が出るようですね。とりあえず、手元で該当のピクセルシェーダのエントリーポイントの関数をvoid型にしてSV_Target外したところ警告は出なくなりました。

このシェーダでは、ピクセルシェーダ中でdiscardしてるのでαで抜くところはそのまま深度が描かれないのでα値を出す必要は無いですね。

この問題は、他にもShadow mapの描画時のシェーダでピクセルシェーダを使っている場合に、レンダーターゲットビューをNULLにした状態でピクセルシェーダがSV_Targetが指定されているようなピクセルシェーダがあると起きるでしょうね。上のコードは、DXUT依存で手元のWindows 8環境ではビルドができない(June 2010のSDK入れたくないので)のですが、たぶんWindows 8だとおきるんでしょうな。

« 猫写真 | トップページ | mixi退会してみた »

Programming」カテゴリの記事

コメント

コメントを書く

コメントは記事投稿者が公開するまで表示されません。

(ウェブ上には掲載しません)

« 猫写真 | トップページ | mixi退会してみた »