Xna 如何在纹理上使用着色器?

Xna 如何在纹理上使用着色器?,xna,hlsl,lighting,Xna,Hlsl,Lighting,我想建立一个基于着色器的照明系统。http://stackoverflow.com/editing-help 为此,我需要对纹理应用某些函数。 如何通过C#/XNA中的着色器算法传递纹理? 我试着这样做: foreach (EffectPass pass in effect.Techniques[0].Passes) { pass.Apply(); } spriteBatch.Draw(shadowmap,

我想建立一个基于着色器的照明系统。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();
            }
但这也无济于事。 我需要通过两个/三个算法过程来传递纹理,所以我需要一种方法来任意地将着色器应用到纹理。有什么方法可以做到这一点吗

编辑: 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();
    }

}

您可以将
效果
传递给

在调用
SpriteBatch.Draw
之前,还可以使用
SpriteSortMode.Immediate
Apply()
不同的效果

(在所有其他模式下,
SpriteBatch
将批量执行其所有操作(设置效果和绘图),直到您调用
End
。这会提供更好的性能,但不会给您在精灵之间设置新效果或状态的机会。)


如果您直接使用效果(而不是通过
SpriteBatch
),则可以在图形设备上设置纹理,如下所示:

GraphicsDevice.Texture[0] = myTexture;
另外
Apply()
设置效果,设置任何其他图形设备状态,然后调用
GraphicsDevice.Draw*()
方法之一



请注意
foreach
循环中的错误。每次调用
Apply()
(即:在循环中)后,必须绘制一些内容。如果将效果传递给
SpriteBatch.Begin
,则不需要循环,因为
SpriteBatch
将在内部为您处理该效果。

您似乎发布了错误的链接。你可以编辑你的帖子或将其添加为评论吗?我尝试了你的解决方案,但仍然无效。我无法将其设置为纹理,因为它是渲染目标。我需要做的是基本上获取纹理,然后对其进行变换。在对其运行两个算法之前,我不会绘制它。我将尝试使用两个渲染目标并将输出从一个渲染到另一个。一个
RenderTarget2D
是一个
Texture2D
。你可以这样使用它。唯一的限制条件是,在将其设置为渲染目标时,不能将其用作纹理。在将其用作纹理之前,请使用
SetRenderTarget(null)
——不过,看起来您已经在这样做了?正如您所建议的那样,使用多个目标实现多重传递效果是正确的解决方案。