您的位置:首页 > 移动开发 > Unity3D

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

2015-06-20 20:40 393 查看

摘要

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

正文

强行更改物体的bound。

在该物体的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 = 0
v2f 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需要画出远处的物体,该怎么办。

就这么办。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  shader camera 渲染