花式分屏,顧名思義,能夠實現各類不規則幾何邊界的分屏,是沒法直接經過調整相機視口能達到效果的(只能實現矩形的分屏),例如斜對角分屏,幾何圖形分屏:app
假設咱們有兩個相機,須要上面的斜對角分屏畫面,和鏡子效果(假如咱們想經過分屏的方式實現)。性能
方式1:兩個相機分別添加兩個RenderTexture,繪製在兩張Image上,上層的Image能夠經過遮罩實現剔除。spa
缺點:RenderTexture佔內存高,遮罩也比較耗性能。code
方式2:一個主相機渲染畫面,一個輔助相機生成RenderTexture。實現一個shader,在Fragment Shader時,經過UV座標區域斷定(好比斜對角分割,分割線UV座標必然是y = x)選擇性將輔助相機的像素替換主相機的像素。blog
Shader "Custom/Shader" { Properties{ _MainTex("Base (RGB) Trans (A)", 2D) = "white" {}//主相機的紋理 _OtherTex("Other Tex", 2D) = "white" {}//輔助相機的紋理 } SubShader{ Tags{ "Queue" = "Transparent" "IgnoreProjector" = "True" "RenderType" = "Transparent" } LOD 100 Cull Off Blend Off//關閉混合 Pass{ CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" struct appdata_t { float4 vertex : POSITION; float2 texcoord : TEXCOORD0; }; struct v2f { float4 vertex : SV_POSITION; half2 texcoord : TEXCOORD0; }; sampler2D _MainTex; sampler2D _OtherTex; float4 _MainTex_ST; v2f vert(appdata_t v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); o.texcoord = TRANSFORM_TEX(v.texcoord, _MainTex); return o; } fixed4 frag(v2f i) : SV_Target { fixed4 col = tex2D(_MainTex, i.texcoord)*ceil( i.texcoord.x - i.texcoord.y) + tex2D(_OtherTex, i.texcoord)*ceil( -i.texcoord.x + i.texcoord.y); return col; } ENDCG } } FallBack "Diffuse" }
實例化自定義shader的材質球,給主相機添加OnRenderImage回調方法,傳入輔助相機的紋理,並從新經過材質渲染:ip
void OnRenderImage(RenderTexture src, RenderTexture dest) { if (cam) { if (cam.targetTexture == null) { cam.targetTexture = new RenderTexture(cam.pixelWidth, cam.pixelHeight, 0); //根據主相機的寬高建立一個一樣寬高的紋理,記錄輔助相機的圖像 } mat.SetTexture("_OtherTex", cam.targetTexture);//傳入輔助相機的紋理 } Graphics.Blit(src, dest, mat); }
效果圖:內存
缺點: 仍是有一個RenderTexture。get
方式3:添加一個主相機,一個副相機,主相機設置更高的深度。副相機的CullingMask去掉TransparentFX層。it
而後添加自定義shader,不須要顯示紋理,RenderQueue指定爲BackGround,並添加對應的材質球。class
Shader "Mask/SplitScreen" { //Simple depthmask shader SubShader { Tags {Queue = Background} Pass {ColorMask 0} } }
接下來在主相機下添加一個Plane,設置Layer爲TransparentFx,指定剛纔的材質球,調整合適位置和角度,就實現了特殊的分屏效果。