2011-08-25 57 views
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(); 
.... 

回答

1

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

如上所述,您仍然必须使用两个渲染目标来将输出从第一遍反转到另一个渲染目标,但最好使用双通道方法而不是将渲染目标发送到其他着色器技术。

伪代码:

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) 
0

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

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

+0

发您好,感谢您的答复,你可以请这方面的任何代码示例。 – Firoz

+0

只需使用RenderTarget2D创建渲染目标MyRenderTarget = new RenderTarget2D(graphicsDevice,width,height);然后使用GraphicsDevice.SetRenderTarget(MyRenderTarget);像正常一样绘制,然后将渲染目标设置为空(将其设置到后台缓冲区)并再次绘制,这次使用MyRenderTarget作为绘制中的Texture参数。 –

+0

http://pastebin.com/kRJLm3r2继承人一个非常粗糙的例子。 –