シェーダーによるピクセルの破棄
必要のないピクセル描画を破棄するためにいくつか方法がある。
- ジオメトリシェーダーを使っているのであれば、Stream.Append()を制御してプリミティブの生成自体をストップさせる。
- ピクセルシェーダー内でdiscard命令を使う。
これを使うと、その後のカラーのリターンは無視される。なんならその場で0リターンでもいいのかも。
- ピクセルシェーダー内でclip(x)命令を使う。
xに指定した変数のどれかのフィールドが0より小さければ描画されなくなる。
エフェクトプール
複数のエフェクトファイルで変数を共有したいことは多々ある。
っていうかあるに決まってるだろ…常識的に考えて…。
で、それを解決させるためにエフェクトプールというのが存在する。
とりあえず使い方は以下の通り。
- エフェクトプールオブジェクトの作成
- D3DX10CreateEffectPoolFromFileを使ってID3D10EffectPoolインターフェースを取得する。
この関数に指定するファイルは共有する変数、ステート、定義、関数などが記述してある。
- (ここではEffectPools.fxhとする)
記述ルールとして、変数は shared cbuff XXXXブロックで括って宣言する。
それ以外はそのまま sharedをつけてしまっていいようだ。
- グローバル変数の設定
- ID3D10Effect* pPoolEffect = m_pEffPool->AsEffect();みたいな感じでエフェクトプールからID3D10Effectを取得して
あとは普通どおりに変数を取得して更新すればよい。
- 各エフェクトファイル内でプールファイルをインクルドする
- 普通に#includeでおっけ。
- 各エフェクトの生成
- D3DX10CreateEffectFromFile()でエフェクトの作成をするのだが注意点が2つ。
・コンパイルフラグにD3D10_EFFECT_COMPILE_CHILD_EFFECTを指定する。
・先に作成済みのエフェクトプールを登録する。
以上で共有化が有効になる。
一時期各エフェクトファイル毎に同じ環境データを持ってたので、無駄がなくなってスッキリ。
最終更新:2009年01月08日 18:49