一、快速搭建一個簡單的場景
如圖,白色的Quad即當作鏡子。
二、使用相機紋理
創建一個相機,放到和鏡子相同的位置(根據具體效果微調),再新建一個renderTexture,鏈接到相機的TargetTexture,並賦給鏡子的材質球當紋理貼圖,如下就能把攝像機拍攝到的東西顯示在鏡子上了。
三、實現鏡面效果
我們現實中的鏡子是左右反向的,所以要對現有紋理進行UV的反向處理。
爲了方便修改,我們可以新建一個系統內置的Unlit Shader,在frag函數中現實UV左右對調,
i.uv.x = 1 - i.uv.x;
這樣再把這個shader賦給鏡子即可。
四、改變鏡子形狀
很多時候鏡子不是方方正正的,這時候就需要使用遮罩來實現不同形狀的鏡子。
我用PS隨便畫了一個形狀的遮罩圖,如下。
遮罩圖只有純黑和純白兩種顏色,要讓鏡面呈現在黑色區域,就可以使用r通道相減剔除,如下
fixed4 col = tex2D(_MainTex, i.uv);
fixed4 maskcol = tex2D(_MaskTex, i.uv);
clip(col.r-maskcol.r);
最後的效果如下
五、附鏡子的Shader代碼
Shader "Unlit/GlassShader"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {} //鏡面主紋理
_MaskTex("MaskTex", 2D) = "white" {} //遮罩紋理
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 100
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f
{
float2 uv : TEXCOORD0;
UNITY_FOG_COORDS(1)
float4 vertex : SV_POSITION;
};
sampler2D _MainTex;
float4 _MainTex_ST;
sampler2D _MaskTex;
v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
return o;
}
fixed4 frag (v2f i) : SV_Target
{
i.uv.x = 1 - i.uv.x; //uv左右反向
fixed4 col = tex2D(_MainTex, i.uv);
fixed4 maskcol = tex2D(_MaskTex, i.uv);
clip(col.r-maskcol.r); //剔除遮罩白色區域
return col;
}
ENDCG
}
}
}