Unity Shader系列文章:Unity Shader目录-初级篇
Unity Shader系列文章:Unity Shader目录-中级篇
效果:
原理:
通过将摄像机的渲染结果实时更新到渲染纹理中,翻转渲染纹理显示。
1. 创建渲染纹理, Create >RenderTexture;
2. 将RenderTexture拖入Camera中,摄像机的渲染结果实时更新到渲染纹理;
3. 编写shader代码,创建材质,将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"
}