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
数量级多了也是很客观的