0

シェーダーに基づいた照明システムを構築したい。http://stackoverflow.com/editing-helpそのために、特定の関数をテクスチャに適用する必要があります。C#/ XNAのシェーダーアルゴリズムにテクスチャを渡すにはどうすればよいですか?私はこれをやってみました:

foreach (EffectPass pass in effect.Techniques[0].Passes)
            {
                pass.Apply();
            }
spriteBatch.Draw(shadowmap,
                new Rectangle(0, 0, range * 2, range * 2),
                new Rectangle((int)screenPos.X - range, (int)screenPos.Y - range, 2 * range, 2 * range),
                Color.White);

しかし、それは機能しません。私もこれを試しました:

spriteBatch.Begin();

            spriteBatch.Draw(shadowmap,
                new Rectangle(0, 0, range * 2, range * 2),
                new Rectangle((int)screenPos.X - range, (int)screenPos.Y - range, 2 * range, 2 * range),
                Color.White);
            spriteBatch.End();
            graphicsDevice.SetRenderTarget(null);
            effect.Parameters["tex"].SetValue(area);
            foreach (EffectPass pass in effect.Techniques[0].Passes)
            {
                pass.Apply();
            }

しかし、これも何もしません。テクスチャを2つまたは3つのアルゴリズムパスに渡す必要があるので、シェーダーをテクスチャに任意に適用する方法が必要です。これを行う方法はありますか?

編集:HLSLコードは次のとおりです。

texture tex;
sampler input  : tex;
float red;
float2 mousepos; 
float4 PixelShaderFunction(float2 coords: TEXCOORD0) : COLOR0
{
    float4 color;
    color=tex2D(input,coords.xy);
    color.r=0.9;
    return color;
}



technique Technique1
{
    pass Pass1
    { 
        PixelShader = compile ps_2_0 PixelShaderFunction();
    }

}
4

1 に答える 1

0

のこのオーバーロードに をEffect渡すことができます。SpriteBatch.Begin

SpriteSortMode.Immediateを呼び出す前に、Apply()別の効果を使用することもできますSpriteBatch.Draw

(他のすべてのモードでは、SpriteBatchはすべての操作 (エフェクトの設定と描画) を が呼び出されるまでバッチ処理しますEnd。これによりパフォーマンスが向上しますが、スプライト間で新しいエフェクトや状態を設定する機会はありません。)


エフェクトを ( 経由ではなく) 直接使用している場合は、次SpriteBatchのようにグラフィックス デバイスにテクスチャを設定できます。

GraphicsDevice.Texture[0] = myTexture;

またApply()、エフェクト、その他のグラフィックス デバイスの状態を設定し、GraphicsDevice.Draw*()メソッドの 1 つを呼び出してすべてを追跡します。


foreachループのエラーにも注意してください。Apply()を呼び出すたびに(つまり、ループ内で)何かを描画する必要があります。エフェクトを に渡す場合、内部で処理されるためSpriteBatch.Begin、ループは必要ありません。SpriteBatch

于 2012-08-30T14:08:41.267 に答える