3つの異なるxna効果があり、1つは初期化、1つは反復、もう1つは最終化と呼ばれます。
Initialiseはテクスチャ入力を受け取らず、3つのターゲットにレンダリングします。Iterateは、これら3つをテクスチャ入力として受け取り、3つのターゲットにレンダリングし、iterateは複数回実行されます。Finalizeは1つのテクスチャ入力を受け取り、1つのターゲットにレンダリングします。
いくつかのヘルパークラスがありますが、以下のレンダリングループから何が起こっているのかは明らかです。
int i = 0;
FractalInitRenderer.DefineOutputs(IterationsAndControl[i], Variables1And2[i], Variables3And4[i]);
FractalInitRenderer.Draw();
for (; i < 50; i++)
{
FractalIterateRenderer.ClearInputTextures();
FractalIterateRenderer.AddInput("IterationsAndControl", IterationsAndControl[i % 2]);
FractalIterateRenderer.AddInput("Variables1And2", Variables1And2[i % 2]);
FractalIterateRenderer.AddInput("Variables3And4", Variables3And4[i % 2]);
FractalIterateRenderer.DefineOutputs(IterationsAndControl[(i + 1) % 2], Variables1And2[(i + 1) % 2], Variables3And4[(i + 1) % 2]);
FractalIterateRenderer.Draw();
}
FractalFinaliseRenderer.ClearInputTextures();
FractalFinaliseRenderer.AddInput("IterationsAndControl", IterationsAndControl[i % 2]);
FractalFinaliseRenderer.Draw();
私のテクスチャ宣言は次のマクロを使用しており、出力構造体とともに次のように定義されています。
#define DECLARE_TEXTURE(Name, index) \
Texture2D<float4> Name : register(t##index); \
sampler Name##Sampler : register(s##index);
struct FRACTAL_OUTPUT
{
float4 IterationsAndControl : COLOR0;
float4 Variables1And2 : COLOR1;
float4 Variables3And4 : COLOR2;
};
私が疑問に思っているのは、入力と出力のレンダリングターゲットを異なるテクスチャレジスタに配置し、2つの反復ピクセルシェーダーを交互に実行して、最初の3つのレジスタから読み取り、最後の3に書き込み、もう1つを最後の3つと最初の3つに書き込みますか?
レンダリングターゲットと入力テクスチャの設定には何度もコストがかかると思いますが、これはもう必要ありません。これはそれを回避しますか、そしてそれはそれだけの価値がありますか?
シェーダー内のコードを個別に最適化できることに注意してください。必要に応じて、個別の質問をします。