首先,要从主画布说起,maincanvas,这个有什么限制?
主画布是一张默认用来绘制UI的地方,这些UI必须是系统提供的UI组件,在画面下挂一个3D物体或非UI的2D物品是不会被绘制到画布上的,但是仍然会绘制到世界空间,但会被UI挡住,因为UI是绘制在所有其它游戏元素(3D物体,精灵,特效)之上的。因为画布的渲染队列数值最高。
渲染队列数值大的绘制会覆盖数值小的绘制,
sprite属于3000的半透明队列,因此,不可能将sprite放到UI上显示,它永远被UI盖住,除非重写它的shader。
因此,要想在UI之上显示一个3D模型,须要使用UI相机。所谓UI相机是指为相机指定target texture参数,相机将绘制到这张贴图而不是屏幕上。
然后将磁盘上生成的这张贴图赋给一个rawtexture组件,这样就将3D模型转为图片然后画到了UI上。
多个相机的作用是根据它们的depth值从小到大来顺序起作用的,与相机位置无关,与相机在场景层级中出现的先后无关,主相机默认 depth:-1。根据相机中的culling mask 属性来决定相机绘制的物件种类,根据相机视口来决定相机可见范围。举例:有A,B,C三个相机,深度值依次为-1,0,1,则绘制时:先启用A相机,从它的角度拍摄一张照片,这张昨默认是渲染到屏幕上的。然后启用B相机,默认设置,渲染到屏幕,这时候屏幕画面被B相机的画面覆盖(A相机在屏幕上的所有像素被覆盖掉),若想保留A相机的画面,同时将B相机的画面叠加上去,这时候可以设置相机的clear color为 depth only
另外:深度测试时,物体的深度值是指物体在相机坐标系中的Z值
PS: 渲染队列按数值划分:
1000:background, 2000: geometry, 3000:transparent, 4000:overlay,文档说明如下:
For special uses in-between queues can be used. Internally each queue is represented by integer index; Background
is 1000,Geometry
is 2000, AlphaTest
is 2450, Transparent
is 3000 and Overlay
is 4000. If a shader uses a queue like this:
Tags { "Queue" = "Geometry+1" }