例如10个相同的物体,位置不同,同一个材质,基于GPU Instancing合批,我们发现每个物体的位置不一样,而位置不是通过材质来修改的,说明了引擎在渲染物体的时候,除了会把材质中的数据传递给渲染管线以外,还会基于每个渲染体来传递数据给渲染管线。
#pragma shader_feature_local_fragment _ALPHATEST_ON #pragma shader_feature_local_fragment _ALPHAPREMULTIPLY_ON // --- // Unity defined keywords #pragma multi_compile_fog #pragma multi_compile_instancing #pragma multi_compile _ DOTS_INSTANCING_ON #pragma multi_compile_fragment _ _SCREEN_SPACE_OCC...
其实我们再仔细一想,发现引擎还会提供一种机制,让我们可以独立的控制渲染体的参数,例如10个相同的物体,位置不同,同一个材质,基于GPU Instancing合批,我们发现每个物体的位置不一样,而位置不是通过材质来修改的,说明了引擎在渲染物体的时候,除了会把材质中的数据传递给渲染管线以外,还会基于每个渲染体来传递数据给渲染...
// GPU Instancing #pragma multi_compile_instancing #pragma instancing_options renderinglayer #pragma multi_compile _ DOTS_INSTANCING_ON #pragma vertex LitPassVertex #pragma fragment LitPassFragment #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" //需要光照系统时增加此引...
然后修改#ifdef UNITY_DOTS_INSTANCING_ENABLED到#endif中的内容,一般是37行到69行,改成如下代码: #ifdef INSTANCEING_ON UNITY_INSTANCING_BUFFER_START(UnityPerMaterial) UNITY_DEFINE_INSTANCED_PROP(float4, _BaseColor) UNITY_INSTANCING_BUFFER_END(UnityPerMaterial) ...
再 新建一个材质,勾选Enable GPU Instancing: 你就 会发现Unity将拥有同一此材质的物体合批渲染了: 值得一提的是,本工程中的飞剑已经被我用Blender手动将顶点数降低到105个了,因为我最后大致要生成4万把飞剑,原本的飞剑模型有上千个顶点,庞大的定点数会导致我的场景近乎卡死,最后测试我的电脑能顶住的最大顶点数...
DOTS 是不是专注解决性能问题?是也不是, 准确来说, 能解决性能问题的技术是 JobSystem 和 Burst, ...
1,省去了实例化prefab的开销 2,主线程,渲染线程相比于go有很多ms的节省,instancing的打断比go少,...
再新建一个材质,勾选Enable GPU Instancing: 你就会发现Unity将拥有同一此材质的物体合批渲染了: 值得一提的是,本工程中的飞剑已经被我用Blender手动将顶点数降低到105个了,因为我最后大致要生成4万把飞剑,原本的飞剑模型有上千个顶点,庞大的定点数会导致我的场景近乎卡死,最后测试我的电脑能顶住的最大顶点数大概...
这个方式有几个好处,动画预先被计算生成到纹理里面,这样代替原来的动画采样计算,空间换时间节省了性能,同时面数少,动画简单,这样动画纹理的内存占用可以接受。针对《弹幕类游戏》有大量的同一种类型的物体,使用MeshRenderer+材质+动画纹理的模式,能最大限度地使用GPU Instancing合批,降低节约DrawCall。