Xna 精灵的多重效果

Xna 精灵的多重效果,xna,directx,shader,hlsl,pixel-shader,Xna,Directx,Shader,Hlsl,Pixel Shader,我已经实现了效果和过渡使用像素着色器文件。当我分别应用“效果”和“过渡”时,效果很好,但如果我同时应用这两种效果,则效果不好。如何将多个着色器应用于精灵。下面是我正在做的代码 _effect = Effect.FromFile(_parentRVRenderer.Device, path, null, ShaderFlags.None, null); _effect1 = Effect.FromFile(_parentRVRenderer.Device, path1, null, ShaderF

我已经实现了效果和过渡使用像素着色器文件。当我分别应用“效果”和“过渡”时,效果很好,但如果我同时应用这两种效果,则效果不好。如何将多个着色器应用于精灵。下面是我正在做的代码

_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();
....

我不确定是否可以同时应用两个着色器。但我要做的是,使用第一个着色器将精灵绘制到渲染目标,然后使用第二个着色器将结果图像绘制到屏幕


显然,如果可以将效果组合到单个着色器中,这将是理想的,但这并不总是可能的。这可能不是最好的解决方案,但应该可以做到这一点。

将两个像素着色器函数放在同一个着色器中,并使用两遍技术,在每个遍中应用不同的像素着色器

如上所述,您仍然必须使用两个渲染目标将输出从第一个过程反弹到另一个过程,但是使用两个过程方法比将渲染目标发送到另一个着色器技术更好

伪代码:

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)
RenderTarget2D[2]目标;
//(将所有精灵绘制到目标0)
//目标1将为空,将在过程0中使用(偶数过程)
effect.technology=“twopasstechnology”;
for(int i=0;i
Hi-Fat,感谢您的回复。请提供任何代码示例。只需使用RenderTarget2D MyRenderTarget=new RenderTarget2D(graphicsDevice,width,height)创建渲染目标即可;然后使用GraphicsDevice.SetRenderTarget(MyRenderTarget);像普通一样绘制,然后将“渲染目标”设置回null(将其设置为“后缓冲区”),然后再次绘制,这次使用MyRenderTarget作为绘制中的纹理参数。