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

但这也无济于事。我需要通过两个/三个算法传递纹理,所以我需要一种将着色器任意应用于纹理的方法。有没有办法做到这一点?

编辑: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

您可以将 an传递Effect给.SpriteBatch.Begin

您也可以SpriteSortMode.ImmediateApply()调用SpriteBatch.Draw.

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


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

GraphicsDevice.Texture[0] = myTexture;

还有Apply()你的效果,设置任何其他图形设备状态,并通过调用其中一种GraphicsDevice.Draw*()方法来跟踪它。


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

于 2012-08-30T14:08:41.267 回答