Unity 相機花式分屏

花式分屏,顧名思義,能夠實現各類不規則幾何邊界的分屏,是沒法直接經過調整相機視口能達到效果的(只能實現矩形的分屏),例如斜對角分屏,幾何圖形分屏: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,指定剛纔的材質球,調整合適位置和角度,就實現了特殊的分屏效果。

相關文章
相關標籤/搜索