0

ピクセル シェーダー ファイルを使用してエフェクトとトランジションを実装しました。エフェクトとトランジションを別々に適用すると正常に機能しますが、両方を同時に適用すると機能しません。スプライトに複数のシェーダーを適用する方法。以下は私がやっていることのコードです。

_effect = Effect.FromFile(_parentRVRenderer.Device, path, null, ShaderFlags.None, null);
_effect1 = Effect.FromFile(_parentRVRenderer.Device, path1, null, ShaderFlags.None, null);
_effect.Technique = "TransformTexture";
_effect1.Technique = "TransformTexture";

_effect1.Begin(0);
_effect1.BeginPass(0);
_effect.Begin(0);
_effect.BeginPass(0);
sprint.Begin()
Sprite.Draw();
....
4

2 に答える 2

1

2 つのピクセル シェーダー関数を同じシェーダーに配置し、パスごとに異なるピクセル シェーダーを適用する 2 パス手法を使用します。

上記のように、最初のパスから別のパスに出力をバウンスするには 2 つのレンダー ターゲットを使用する必要がありますが、レンダー ターゲットを別のシェーダー手法に送信するよりも、2 パス アプローチを使用する方が適切です。

擬似コード:

RenderTarget2D[2] targets;

// (Draw all your sprites to target 0)

// target 1 will be empty, will be used in pass 0 (even pass)

effect.Technique = "TwoPassTechnique";

for (int i = 0; i < effect.Passes.Count; i++) 
{
    // Even pass sets target 1, odd pass sets target 0
    GraphicsDevice.setRenderTarget(targets[1 - i % 2]);
    effect(i).BeginPass;

    // Even pass samples texture from target 0, odd pass uses target 1
    effect(i).Parameters["texture"].SetValue(targets[i % 2]);

    // Draw a 2D quad with extents (-1, -1), (1, 1) in screen space 
}
// Final contents are now stored in target 0

// (Draw target 0's texture to the screen, using a sprite or another 2D quad)
于 2011-09-08T17:21:28.520 に答える
0

2 つのシェーダーを同時に適用できるかどうかはわかりません。しかし、私がすることは、最初のシェーダーを使用してレンダー ターゲットにスプライトを描画し、2 番目のシェーダーを使用して結果の画像を画面に描画することです。

エフェクトを 1 つのシェーダーに組み合わせることができれば理想的ですが、それが常に可能であるとは限りません。これは最善の解決策ではないかもしれませんが、うまくいくはずです。

于 2011-08-26T08:00:13.573 に答える