有效组合多个像素着色器

Hoe*_*loe 14 c# xna effect pixel-shader xna-3.0

所以我用XNA 3.1做了一件事,我有很多通过像素着色器应用的单独效果.它们来自各种来源,例如特殊攻击,环境等.我遇到的问题是我注意到帧速率的显着降低.

目前,我正在将整个场景绘制到RenderTarget2D,然后我将所有效果应用到.我存储了一个包含效果及其ID的SortedDictionary(这些ID用于在运行时更改参数),我正在迭代它并逐个应用每个效果:

foreach(KeyValuePair<Ref<int>,Effect> p in renderEffects)
{
    Effect r = p.Value;
    g.SetRenderTarget(0, MainGame.MainRenderTarget);
    //Change RenderTarget to allow code to grab existing texture in the same draw area.
    levelDraw = MainGame.LevelRenderTarget.GetTexture();
    //Change back to draw back to this texture, allowing render effects to be layered.
    g.SetRenderTarget(0, MainGame.LevelRenderTarget);

    MainGame.StartDraw(MainGame.GameBatch);
    //Starts the sprite batch and sets some parameters
    r.Begin();
    r.CurrentTechnique.Passes[0].Begin();
    MainGame.GameBatch.Draw(levelDraw, new Rectangle(0, 0, levelDraw.Width, levelDraw.Height), Color.White);
    r.CurrentTechnique.Passes[0].End();
    r.End();
    MainGame.GameBatch.End();
}
Run Code Online (Sandbox Code Playgroud)

现在,当仅分层3个效果时,这会产生明显的帧丢失,当应用10时,它会从60FPS下降到16FPS,这当然是不可接受的.我想知道是否有更有效的方法来做到这一点.考虑到我只有一个纹理,我认为我可以将效果组合到一个文件中并执行多次传递而不会重新获取纹理.但是,我不确定这是否可行.

我不确定最好的方法是如何做到这一点,尽管我认为必须有一种比我正在做的更好的方式.

dou*_*536 1

当你画画的时候,你是否对所有东西都进行了完全的阴影处理?如果您的着色器计算量很大,您应该首先执行“深度传递”,仅进行 z 测试/写入 Z 缓冲区(颜色缓冲区写入关闭)。另外,使用简单的着色器来“深度填充”屏幕。

换句话说,渲染所有不透明对象,仅在第一遍更新深度缓冲区。

在第二遍中,您打开着色器(并关闭深度写入,无需使用带宽来写回已存在的相同值)。这将掩盖任何过度绘制像素的所有不必要的工作,因为它们将立即无法通过深度测试。

编辑:现在我意识到OP正在做全屏效果,而不是场景渲染。