[Unity3D]如何渲染一个在camera frustum外面的物体

来源:互联网 发布:tomcat 域名绑定 编辑:程序博客网 时间:2024/05/17 22:17

摘要

每个camera都对应一个六面体,如果某物体完全与这个六面体不相交,则会被剔除,不会被渲染。但是又非得画这个物体,怎么办呢。

正文

  1. 强行更改物体的bound。
  2. 在该物体的vertex shader中设定特殊的、指定的SV_POSITION。

这样能发生什么:
用代码强行更改一个物体的bound,变大或者移动。如果这个bound和camera的frustum相交,则Unity不会对其剔除,那么这个物体的shader将被执行,在vertex shader中再修改SV_POSITION,就可以让该物体在指定的位置渲染,far clip,near clip,或者其他位置。

//将vertex移动到far clip位置。同理移动到near clip对应o.vertex.z = 0v2f vert(data i){    v2f o;    o.vertex = mul(UNITY_MATRIX_MVP, i.vertex);    o.vertex.z = o.vertex.w;    return o;}

上面所说的方法可以实现下图中的功能:
这里写图片描述

有些时候,如果物体与far clip部分相交,那么可以采用下面这种方式来实现对物体部分vertex的修改:

v2f vert(data i){    v2f o;    o.vertex = mul(UNITY_MATRIX_MVP, i.vertex);    o.vertex .z = min(o.vertex .z, o.vertex .w);    return o;}

上述shader将far clip外的vertex都显示了出来,又保证了far clip内的vertex的depth信息。
这里写图片描述这里写图片描述

最后

在大型3D场景中,camera的nearclip和farclip差的太大会产生Zfight,避免这个的方式是采用两个camera,区分layer来渲染。一个camera负责近处,一个负责远处,那么如果近处的camera需要画出远处的物体,该怎么办。
就这么办。

0 0
原创粉丝点击