Unity 快速实现镜子效果

一、快速搭建一个简单的场景

如图,白色的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
        }
    }
}

猜你喜欢

转载自blog.csdn.net/YasinXin/article/details/105421338