欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

unity 后处理优化整理

程序员文章站 2022-06-10 23:51:25
...

关于后处理优化,整理几条

1.用OnPreRender和OnPostRender替换OnRenderImage

    private void OnPreRender()
    {    
        cameraRenderTex = RenderTexture.GetTemporary(Screen.width, Screen.height, 24, RenderTextureFormat.Default);
        mainCamera.targetTexture = cameraRenderTex;
    }

    private void OnPostRender()
    {
        Graphics.Blit(cameraRenderTex, null as RenderTexture);
        RenderTexture.ReleaseTemporary(cameraRenderTex);
    }

当我们的camera开启MSAA或者HDR的时候,会导致后处理不起效果,HDR可以不用,不过抗锯齿还是要用的,这是直接改rendertexture的参数就可以

    private void OnPreRender()
    {    
        if(QualitySettings.antiAliasing == 0)
        {
            cameraRenderTex = RenderTexture.GetTemporary(Screen.width, Screen.height, 24, RenderTextureFormat.Default, RenderTextureReadWrite.Default);
        }
        else
        {
            cameraRenderTex = RenderTexture.GetTemporary(Screen.width, Screen.height, 24, RenderTextureFormat.Default, RenderTextureReadWrite.Default, QualitySettings.antiAliasing);
        }       
        mainCamera.targetTexture = cameraRenderTex;
    }

    private void OnPostRender()
    {
        Graphics.Blit(cameraRenderTex, null as RenderTexture);
        RenderTexture.ReleaseTemporary(cameraRenderTex);
    }

2.整合后处理效果

以OnRenderImage的做法举例:通常是每个效果是一个脚本,他有自己的OnRenderImage,如果我们有4个效果,那就是4个单独的OnRenderImage,这在代码层面的简洁性和易扩展性上,当然是有优势的。但是,这样做,性能是有问题的,我们需要尽量将各种后处理效果,整合到同一个OnRenderImage(或pre post方法)中,这样能带来一些性能提升,虽然不如上面的pre post效果明显,但是优化是一点点积累的,也是值得做。

3.修改材质属性,不要使用string

 

把shader变量id缓存起来,加入这个shader用了_MaskTex这个变量,另外一个shader的_MaskTex变量的id也是一样

_MaskTex = Shader.PropertyToID("_MaskTex");

 

原来用string是这样的

Mat.SetTexture(“_MaskTex”, Mask);

加了缓存之后可以这么写

Mat.SetTexture(_MaskTex, Mask);

为什么可以这么写,因为material.settexture(“string”,tex)反编译可以看到

material.settexture(Shader.PropertyToID(“string”),tex)

这里多了一步转id,所以缓存起来,能优化一点是一点

4.不怎么影响效果情况下,尽可用fixed代替float和half

数量级多了也是很客观的

 

总结

优化这个东西,是能优化就优化,积累小优化多了,还是很可观的