Unity3D中簡單地應用玻璃材質
阿新 • • 發佈:2019-02-17
最近在學習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,選擇剛才建立的圖片。
然後就能實現一個基本的玻璃效果了:
更高階的玻璃效果諸如加入反射啊,折射啊,還需要以後慢慢來學習。不過一步一個腳印,總有學會的一天~