Unity3d 一个简单的玻璃效果实现!
其实网上有很多玻璃效果的shader,我也是在网络上找了找,发现官网的demo“Bootcamp Demo”里面有个玻璃的shader,感觉效果不错还挺简单的,于是修改了下,本来那个Shader需要3张图,这里为了简单起见,改成用一张图,现在分享给大家,用来实现简单的玻璃效果是没有问题的。
1.首先创建一个shader,然后直接双击文件,系统会用默认编辑器打开它,将下面的代码直接覆盖即可。
Shader "Glass"
{
Properties
{
_MainTex ("Main Texture", 2D) = "white" {}
}
Subshader
{
Tags { "Queue" = "Transparent" }
Pass
{
Cull Off
ColorMask RGB
Blend SrcAlpha OneMinusSrcAlpha
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
uniform sampler2D _MainTex;
uniform float _ReflectValue;
struct vertInput
{
float4 vertex : POSITION;
float3 normal : NORMAL;
float2 texcoord : TEXCOORD0;
};
struct vertOutput
{
float4 pos : POSITION;
float2 texcoord : TEXCOORD0;
float3 reflectVec : TEXCOORD1;
};
vertOutput vert(vertInput i)
{
vertOutput o;
//Set position.
o.pos = mul (UNITY_MATRIX_MVP, i.vertex);
//Set texcoord.
o.texcoord = i.texcoord;
//Calculate normal and position in camera space.
float3 normWorld = normalize( mul((float3x3)UNITY_MATRIX_IT_MV, i.normal));
float3 posWorld = mul(UNITY_MATRIX_MV, i.vertex).xyz;
//Set vector used in cubeMap reflection.
o.reflectVec = reflect(posWorld, normWorld);
return o;
}
half4 frag( vertOutput i ) : COLOR
{
//Get colors of MainTexture and AlphaTexture.
half4 colorTex = tex2D(_MainTex, i.texcoord);
return colorTex;
}
ENDCG
}
}
SubShader {
Tags { "Queue" = "Transparent" }
Pass {
Cull Off
ColorMask RGB
Blend SrcAlpha OneMinusSrcAlpha
SetTexture [_MainTex] { combine texture }
}
}
}
编辑好保存就行了,系统会自动读取出来名字为Glass的Shader。
2.准备一张带透明通道的PNG图,在PhotoShop中做一张图,透明度高点,大概80%以上,颜色你可以自己选择,试一试效果。我使用的是一张淡蓝色的透明度90%的128*128的PNG图,注意一定要是PNG或者PSD图,只有他们带透明通道。
3.在场景中新建一个CUBE,将它拉长拉细点,感觉像块玻璃就可以了,然后将刚才的那张PNG图拖给它,然后修改shader为第一步新建的shader,然后就OK了。
4.看看效果,一个简单的玻璃就这么实现了。