2

私の全体的な目標は、複数のテクスチャを入力として受け取り、複数のターゲットにレンダリングするピクセル シェーダーを作成できるようにすることです。シェーダーの初期化とファイナライズを使用するだけでなく、このシェーダーを繰り返し実行することで、結果が得られます。

以前に複数の入力テクスチャを持つシェーダーと、複数のターゲットにレンダリングするシェーダーを作成したことがありますが、2 つを組み合わせたことはありません。

私が問題を引き起こしていると信じているのは、セマンティクスと、入力および出力テクスチャを適切に設定する方法を完全に理解していないことです。

入力テクスチャを取得するいくつかの異なる方法を見てきましたが、どのように設定すればよいかについて混乱しています。

以下は、init および iterate シェーダーによって出力される共有構造体のコードです (finalize シェーダーは単に色を出力します)。

構造体 FRACTAL_OUTPUT
{
    float4 IterationsAndControl : COLOR0;
    float4 Variables1And2 : COLOR1;
    float4 Variables3And4 : COLOR2;
};

以下は iterate シェーダーと finalize シェーダーのテクスチャー宣言です (init シェーダーはテクスチャーを使用しません)。

Texture2D IterationsAndControl;
サンプラー IterationsAndControlSampler : register(s4)
{
    テクスチャ = <IterationsAndControl>;
};

Texture2D 変数 1And2; サンプラー Variables1And2Sampler : レジスター(s5) { テクスチャ = <IterationsAndControl>; };

Texture2D 変数 3And4; サンプラー Variables3And4Sampler : レジスター(s6) { テクスチャ = <IterationsAndControl>; };

C# XNA コードでは、(GraphicsDevice.SetRenderTargets() を実行して) レンダー ターゲットを設定し、(Effect.Parameter["TextureVariableName"].SetValue() を実行して) テクスチャ パラメーターを設定し、(スプライト バッチを介して) クワッドを描画します。

このようなことをする例が見つからないので、どんな助けでも大歓迎です。

4

1 に答える 1

2

興味のある他の人のために、私は(多くの試行錯誤を経て!)これを機能させることができました。

私は数値計算を行っているので、レンダー ターゲットの形式を Vector4 に設定しました (以前は rgba64 があり、動作していないようでした)。現在ベクター形式を使用しているため、デバイス サンプラーを SamplerState.Point に変更する必要もありました。

GraphicsDevice.SamplerStates[0] = SamplerState.PointClamp;
GraphicsDevice.SamplerStates[1] = SamplerState.PointClamp;
GraphicsDevice.SamplerStates[2] = SamplerState.PointClamp;
GraphicsDevice.SamplerStates[3] = SamplerState.PointClamp;

私の FRACTAL_OUTPUT 構造体は変更されていません。

変更されたのはサンプラーです。XNA エフェクト サンプラーで定義されているマクロを使用しています。

#define DECLARE_TEXTURE(Name, index) \
Texture2D<float4> Name : register(t##index); \
sampler Name##Sampler : register(s##index);

次に、複数のテクスチャをサンプリングするために、次のことを行っています。

DECLARE_TEXTURE(IterationsAndControl, 1);
....
return tex2D(IterationsAndControlSampler, texCoord).x;

次に、c# で通常の方法でレンダー ターゲットを設定し、入力テクスチャを他のエフェクト パラメータと同じように設定します。

于 2011-03-31T09:13:55.957 に答える