Unity Shader 渲染纹理的镜子效果

Unity Shader系列文章:Unity Shader目录-初级篇

Unity Shader系列文章:Unity Shader目录-中级篇

效果:
镜子效果
原理:

通过将摄像机的渲染结果实时更新到渲染纹理中,翻转渲染纹理显示。
1. 创建渲染纹理, Create >RenderTexture;
2. 将RenderTexture拖入Camera中,摄像机的渲染结果实时更新到渲染纹理;
3. 编写shader代码,创建材质,将RenderTexture拖到材质上。

RenderTexture拖入Camera中
RenderTexture拖到材质上

shader代码:

// 镜子效果
Shader "Custom/Mirror"
{
    Properties
    {
        _MainTex ("Main Tex", 2D) = "white" { } // 渲染纹理
    }

    SubShader
    {
        Tags { "RenderType" = "Opaque" "Queue" = "Geometry" }

        pass
        {
            CGPROGRAM

            #pragma vertex vert
            #pragma fragment frag

            #include "UnityCG.cginc"

            sampler2D _MainTex;
            // _MainTex_ST(声明方式:name_ST): 声明_MainTex是一张采样图,用于uv运算, 下面2个是等价的
            // o.uv = TRANSFORM_TEX(v.texcoord,_MainTex);
            // o.uv = v.texcoord.xy * _MainTex_ST.xy + _MainTex_ST.zw;
            // 如果没有声明是不能进行TRANSFORM_TEX的运算的。_MainTex_ST.xy为纹理图Tiling(缩放), zw为纹理中的offset(偏移)
            // 如果Tiling 和 Offset留的是默认值,即Tiling为(1,1) Offset为(0,0)的时候,可以不用TRANSFORM_TEX运算
            // 即:o.uv = v.texcoord
            float4 _MainTex_ST;

            // 应用传递给顶点着色器的数据
            struct a2v
            {
                float4 vertex: POSITION; // 语义:模型空间下的顶点坐标
                float4 texcoord: TEXCOORD0; // 语义:模型第一组纹理坐标
            };

            // 顶点传递给片元着色器的数据
            struct v2f
            {
                float4 pos: SV_POSITION; // 语义:裁剪空间下的顶点坐标
                float2 uv: TEXCOORD0;
            };

            // 顶点着色器函数
            v2f vert(a2v v)
            {
                v2f o;
                // 将顶点坐标从模型空间变换到裁剪空间
                // 等价于o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
                o.pos = UnityObjectToClipPos(v.vertex);

                // 计算纹理坐标(缩放和平移)
                // 等价于o.uv = v.texcoord * _MainTex_ST.xy + _MainTex_ST.zw;
                o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);

                // 纹理X翻转,因为镜子里图像是左右相反的
                o.uv.x = 1 - o.uv.x;

                return o;
            }

            // 片元着色器函数
            fixed4 frag(v2f i): SV_TARGET
            {
                // 对主纹理采样
                fixed4 color = tex2D(_MainTex, i.uv);
                return color;
            }
            
            ENDCG

        }
    }

    Fallback "Off"
}

你可能感兴趣的:(Unity Shader 渲染纹理的镜子效果)