您的位置:首页 > 移动开发 > Unity3D

Unity3D中简单地应用玻璃材质

2014-09-16 18:35 288 查看
最近在学习Unity3D。发现Unity3D中的玻璃效果要用到Shader才能实现。虽然简单学习了一下能看懂Shader的结构了,但要自己写一个实现自己想要的效果的Shader暂时还无能为力。这个要么需要十足的经验,要么具有相当的抽象思维。(可惜这两个我都没有…………)

随后在网上找了一个可以可以实现玻璃材质的shader。

源博客是在:http://www.cnblogs.com/yb_lin/archive/2011/04/21/2023475.html

首先新建一个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;
<span style="white-space:pre">				</span>//Set position.
o.pos = mul (UNITY_MATRIX_MVP, i.vertex);
<span style="white-space:pre">				</span>//Set texcoord.
o.texcoord = i.texcoord;
<span style="white-space:pre">				</span>//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;
<span style="white-space:pre">				</span>//Set vector used in cubeMap reflection.
o.reflectVec = reflect(posWorld, normWorld);
return o;
}
half4 frag( vertOutput i ) : COLOR
{
<span style="white-space:pre">				</span>//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中第一行显示的名字

然后在PS中创建一个半透明的纹理。



保存为psd或者png格式都可以。之后在Unity3D中选择Texture,选择刚才创建的图片。



然后就能实现一个基本的玻璃效果了:



更高级的玻璃效果诸如加入反射啊,折射啊,还需要以后慢慢来学习。不过一步一个脚印,总有学会的一天~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: