赞
踩
如图,白色的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 "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
- }
- }
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。