Image Effect的效率问题当如何优化?

1回答

Image Effect的效率问题当如何优化?

提问者 felix 2016-01-13 873浏览
我们在游戏中使用了战争迷雾效果,方案是在摄像机的OnRenderImage中做处理,将后缓冲的纹理上的像素依据游戏逻辑数据设定为黑色或者场景原先的白色。但一旦使用这个迷雾效果,场景中的物件DrawCall数量就暴增,大概1倍左右。想咨询下出现这个问题的原因

后处理效果确实开启了depthTexture,在Proifiler中也发现了UpdateDepthTexture中有大量的MeshVBO.DrawCall()调用。

我们游戏中的这个后处理效果,需要使用深度值的原因是:渲染3D世界的迷雾时,需要将场景未探测部分加上黑影,这中间需要使用深度值来从屏幕坐标反算出世界坐标。经过我自己的测试,发现了一个奇怪的现象,这是我们迷雾效果实现的shader代码片段
float3 CamToWorld (in float2 uv, in float depth)
{
 float3 pos = float3(uv.x * 2.0 - 1.0, uv.y * 2.0 - 1.0, depth);
 float4 finalPos = mul(_InverseMVP, float4(pos, 1.0));
 return finalPos.xyz / finalPos.w;
}

float depth = UNITY_SAMPLE_DEPTH(tex2D(_CameraDepthTexture, i.uv));
float3 pos = CamToWorld(i.uv, depth);
经过这段代码,我们就可以去到正确的世界坐标值pos,然后在shader中判定这一点是明还是暗。

我做了一个修改,因为迷雾总是在场景最上层的,所以我认定它的depth值肯定是最大的,那就是1.0f,所以我将从DepthTexture中获取深度这个步骤省略掉,直接这么写:
//float depth = UNITY_SAMPLE_DEPTH(tex2D(_CameraDepthTexture, i.uv));
float depth = 1.0;
float3 pos = CamToWorld(i.uv, depth);
这样在游戏中,得到的效果完全一样。由于对Unity的渲染管线不了解,希望能帮忙确认下这个思路的正确性。感谢!


问题类型 : 编辑器相关     开发平台 : Windows 7     发布平台 : Windows     Unity 版本 : Unity Pro     版本号 : 4.6.1f     优先级 : 一般故障   

快来消灭0回答吧

{{ dataList.answer_count | view-format }}回答
  • Unity官方专家 2016-01-13 09:18
    可能是因为你们的后处理需要开启 depthTexture 的缘故,开启后会多大约一倍的 drawcall 来绘制深度,你们可能做一个确认,看代码中是否有开启,详见: 
    http://docs.unity3d.com/ScriptReference/Camera-depthTextureMode.html

    从 shader 中看,你们有一步是计算出”视线和海平面的交点“,这一步其实是不需要场景深度的,不论 depth 是多少,通过 CamToWorld 还原后的点,都是在视线上的。也就是说,不论 depth 取多少,float3 dir = normalize(pos - _CamPos.xyz); 所得到的值是不变的。

    所以 depth 是多少,最终是不会影响“视线和海平面的交点”的计算结果的,从而也就不会影响到后续的计算结果了。 
    0评论
  • {{ answer.user.NickName }} {{ answer.profession }} {{ answer.created_at | time-format }}
    专家回答
    {{{ answer.answer }}}
    {{ answer.answer_count | view-format }}评论
加载中... 查看更多回答