1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96
| Shader "Unlit/Refraction" { Properties { _RefractRatio("RefractRatio", Range(0.1, 1)) = 0.5 _RefractiveIndexA("RefractiveIndexA", Range(1, 2)) = 1 _RefractiveIndexB("RefractiveIndexB", Range(1, 2)) = 1.3 _Cube("Cubemap", Cube) = ""{} _RefractAmount("RefractAmount", Range(0, 1)) = 1
_Color("Color",Color) = (1,1,1,1) _RefractColor("_RefractColor",Color) = (1,1,1,1) } SubShader { Tags { "RenderType"="Opaque" "Queue"="Geometry" } Pass { Tags{"LightMode" = "ForwardBase"} CGPROGRAM #pragma vertex vert #pragma fragment frag #pragma multi_compile_fwdbase
#include "UnityCG.cginc" #include "Lighting.cginc" #include "AutoLight.cginc"
fixed _RefractRatio; samplerCUBE _Cube; fixed _RefractAmount; fixed4 _Color; fixed4 _RefractColor; struct v2f { float4 pos : SV_POSITION; float3 worldRefr:TEXCOORD0; float3 worldNormal:NORMAL; float3 worldPos:TEXCOORD1;
SHADOW_COORDS(2) };
v2f vert (appdata_base v) { v2f o; o.pos = UnityObjectToClipPos(v.vertex); o.worldNormal = UnityObjectToWorldNormal(v.normal); o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz; fixed3 viewDir = UnityWorldSpaceViewDir(o.worldPos); o.worldRefr = refract(normalize(-viewDir),normalize(o.worldNormal), _RefractRatio); TRANSFER_SHADOW(o); return o; } fixed4 frag(v2f i):SV_TARGET {
fixed3 worldLightDir = normalize(UnityWorldSpaceLightDir(i.worldPos)); fixed3 diffuse = _LightColor0.rgb * _Color.rgb * max(0,dot(normalize(i.worldNormal),worldLightDir)); fixed3 cubemapColor = texCUBE(_Cube,i.worldRefr).rgb * _RefractColor.rgb; UNITY_LIGHT_ATTENUATION(atten,i,i.worldPos); fixed3 color = UNITY_LIGHTMODEL_AMBIENT.rgb + lerp(diffuse,cubemapColor,_RefractAmount) * atten; return fixed4(color,1); } ENDCG }
} FallBack "Reflective/VertexLit" }
|