(学习记录)性能优化
①细分着色器似乎不能支持GPU instancing,图片来源:Tessellation (catlikecoding.com)
但是几何着色器可以:Is it possible to have GPU Instancing with Geometry shader? - Unity Forum
视锥体剔除
①原理:理论原理:(36条消息) 【unity】性能优化之——视锥体剔除(Frustum Culling)(一)_程序员茶馆的博客-CSDN博客
代码原理:Unity中使用ComputeShader做视锥剔除(View Frustum Culling) - 知乎 (zhihu.com)
②实战:(36条消息) 【unity】性能优化之——视锥体剔除(Frustum Culling)(一)_程序员茶馆的博客-CSDN博客
(36条消息) 【Unity】相机视锥体剔除算法_魔术师Dix的博客-CSDN博客
//2023.5.20
(7 封私信) 为什么在ndc归一化坐标已经包含了视锥体剔除功能的情况下 还需要视锥体裁剪? - 知乎 (zhihu.com)
问:视锥体裁剪和渲染管线中几何阶段的裁剪的不同?
答:视锥体裁剪应用在CPU阶段,也就是渲染管线的应用程序阶段,我们相当于编写了一个指令,该指令就是不去渲染包围盒外的物体,然后传递给GPU,而渲染管线中几何阶段的裁剪是GPU操控的,在没有视锥体裁剪的时候,CPU将会发送所有物体给GPU进行裁剪。
//2023.5.22
unity中视锥体相关API
①GeometryUtility.CalculateFrustumPlanes(camera);——解释:输入摄像机,获取视锥体6个平面(AABB),返回数据类型Plane[]。
其他API:
②GeometryUtility.TestPlanesAABB(CameraSourcePlanes, bounds);——解释:输入AABB,物体mesh边界,获取一个布尔值,可判断该mesh是否在AABB内
具体代码:
为了方便我设定为挂在摄像机上了
缺点:①剔除时,阴影也会被剔除,这就导致AABB之外的物体投射到AABB之内物体的阴影消失
左:剔除 右:未剔除
//2023.5.23
解决方案①:阴影视锥裁剪实现 - 知乎 (zhihu.com) 再聊阴影裁剪与高性能视锥剔除 - 知乎 (zhihu.com)。该方法只适用于1平行光,2透视相机
解决方案②:脚本不直接控制物体的enable而是去控制meshrender组件的shadowcastingmode为shadows only,这样设置之后物体网格就不会渲染,并保留阴影,另外也要把receive shadows关闭
遮挡剔除
原理:
对于不移动相机的场景来说,可以使用以下方法进行优化:
[Unity教程]-达哥专辑-这个高逼格场景居然不用网格模型!?Unity无模型研究-第一期_哔哩哔哩_bilibili
[Unity教程]-达哥专辑-如何欺骗眼睛让手游有3A等级画面。Unity无模型研究-第二期_哔哩哔哩_bilibili
[Unity教程]-达哥专辑-天天直播 360照片如何和3D交互?无模型场景研究-第三期_哔哩哔哩_bilibili
主要原理就是将场景拍摄成360照片,以达到无模型(也就是减少drawcall)的情况