Unity2018GpuInstancing变黑临时解决

  • Unity2018支持烘焙过的对象也开启GPUInstancing,但是项目升级到Untiy2018(目前版本是2018.2.14f)后发现一个比较严重的BUG,就是如果一个MeshRenderer的对象,如果不参与烘焙而开启了GPUInstancing的话在安卓手机上反而会出现莫名其妙的黑色面片看起来像是别的网格的,猜测可能是GPUInstancing的时候哪里计算错了,尝试了好多天才定位问题,并且又花了2个星期都没有解决,最终找到了一个临时的解决方法。
  • 我这里场景中不需要参与烘焙的对象主要是一些树,树本身是cutout的,如果参与烘焙的话,树周围的区域会变暗甚至直接黑了。所以下面这个方法也是争对这个问题来解决的。

  • 这个方法需要这些对象的材质支持Lightmap 的gpuinstancing.
 struct appdata
                     {
                           float4 vertex : POSITION;
                           float2 uv : TEXCOORD0;
                           float4 texcoord1:TEXCOORD1;//lightmap uv
                           float3 normal:NORMAL;
                     };

v2f vert (appdata v)
                     {
                           v2f o;
                           o.pos = UnityObjectToClipPos(v.vertex);
                           o.worldPos = mul(unity_ObjectToWorld, v.vertex);
                           o.uv.xy = TRANSFORM_TEX(v.uv, _MainTex);
                           //下面这句是Lightmap相关,去掉会破话Gpuinstancing
                           o.uv.zw = v.texcoord1.xy * unity_LightmapST.xy + unity_LightmapST.zw;
                           o.worldNormal = UnityObjectToWorldNormal( v.normal);
                           TRANSFER_SHADOW(o);
                           return o;
                     }
  1. 先把场景里本来不应该参与的对象放到集中放到一个对象(这里起名BakeReplace,并且为了后面的操作方便,坐标一开始是全0的)下面,然后统一标记这个对象及子对象为static lightmap让这些对象参与烘焙。
  2. 但是为了不干扰本来的正常烘焙,需要把这个组的根(BakeReplace)的Y坐标改成-2000。
  3. 这些些对象本来是不参与烘焙的,所以如果可以考虑修改这些对象的Lightmap Scale为一个很小的值,建议用脚本批量设置。而且需要结合项目实际情况是否缩放以及缩放多少。
  4. 烘焙。
  5. 烘焙完成后把根(BakeReplace)的坐标还原回来,Y=0.然后再保存一下场景就好了。

这个方法的原理就是让这些对象参与烘焙并且在最终的LightMap中有他们的信息,但是又不让这些对象对其他正常烘焙的对象产生干扰。


当然还是期待Unity官方早点直接解决这个BUG。

你可能感兴趣的:(Unity2018GpuInstancing变黑临时解决)