Unity[Camera]RenderTexture使用
关于Camera.activeTexture和Camera.targetTexture
在Get的时候,Get到的是否为同一个RenderTexture我知道这两个的区别是一个只能获得当前所正在渲染的RenderTexture,一个是既可以获得也可以设置渲染目标,但这样activeTexture有什么必要性呢
- Camera.targetTexture必须在相机指定Render Target才会非null,Camera.activeTexture获取到的值和调用的时机有关系。官方文档中写着可以在OnPostRender中获取到,比如使用了后处理,在OnPostRender中可以获取到后处理申请的RenderTexture,在Update中获取就是null。如果给相机设置了RenderTexture,那么targetTexture就是设置的RenderTexture。如果没有开启HDR,在OnPostRender中activeTexture获取到的也是这个RenderTexture。如果开启了HDR,则是一个另外申请的RenderTexture。
- 推荐使用RenderDoc查看渲染状态,分为两种情况,在安卓平台上开启了Always Blit和没开启会不一样。开启了Always Blit,会在最后多一个Present的过程,在Present之前,会将所有的渲染渲染到一个叫tex的RenderTexture上(这里不考虑后处理以及HDR导致生成了额外的RenderTexture),在Present的时候将tex Copy到Backbuffer里面。如果没有开启AlwaysBlit,比如Blit Type是Never,那么所有的渲染都是直接渲染到Backbuffer的(这里同样不考虑RenderTexture的情况),Blit Type为Auto的时候没有遇到出现Present的情况,在线性空间也没出现Present 。Backbuffer和那个用来Present的tex这两个对象都可以理解为系统提供的,从C#脚本中是没法获取到的,而且从Profiler里面也是看不到这两个对象的大小的。
- 总结起来就是:大部分情况下Camera.targetTexture都是为null的,除非相机设置了RenderTarget。
对于Camera.activeTexture,这个需要看调用时机,在OnPostRender中调用,如果有使用后处理或者HDR,则可以获取到申请到的RenderTexture,在Update里面获取是null的,其他的函数阶段没有详细测试过。
对于Backbuffer,这个系统是提供的,C#脚本是获取不到的。而且不一定是直接绘制到Backbuffer,就算没有使用后处理或者HDR,如果开启了Always Blit,也是会多一个中间层,在最后阶段中间层会Copy到Backbuffer。
————————————————
版权声明:本文为CSDN博主「UWA」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/UWA4D/article/details/109771440
关于RenderTexture释放问题的记录
- rt.Release()可以释放对应的显存内容(GfxDevice),但是不会删除这个UnityEngineObject本身,在Profiler里看的大小并没有考虑是否释放显存
- 先Release()再Destroy完全是多余的
https://zhuanlan.zhihu.com/p/41251356