2

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つに書き込みますか?

レンダリングターゲットと入力テクスチャの設定には何度もコストがかかると思いますが、これはもう必要ありません。これはそれを回避しますか、そしてそれはそれだけの価値がありますか?

シェーダー内のコードを個別に最適化できることに注意してください。必要に応じて、個別の質問をします。

4

1 に答える 1

0

ドキュメントに記載されているように:

描画時に、テクスチャをレンダリングターゲットとステージのテクスチャとして同時に設定することはできません。

基本的に、あなたがしていることの概念は問題ありません。3つの入力テクスチャと3つの出力テクスチャを用意し、パスごとにそれらを切り替えます。ただし、明示的に切り替える必要があります。

ただし、幸いなことに、 Windowsでは、テクスチャとレンダリングターゲットの変更は比較的安価な操作であると確信しています。単一のサーフェスのみを作成するためにRenderTargetUsage(おそらく設定)をいじりたい場合があります。(動作は以前のバージョンでのみ文書化されており、変更されている可能性がPreserveContentsあるため、XNA 4.0の機能は完全にはわかりません。PIXで調べてみてください)。

一方、Xbox360は別の話です。

于 2011-03-31T13:39:25.153 に答える