1月8日(2009)


シェーダーによるピクセルの破棄

必要のないピクセル描画を破棄するためにいくつか方法がある。

  • ジオメトリシェーダーを使っているのであれば、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
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。