123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113 |
- // Upgrade NOTE: replaced '_Object2World' with 'unity_ObjectToWorld'
- // Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
- Shader "FX/Gem"
- {
- Properties {
- _Color ("Color", Color) = (1,1,1,1)
- _ReflectionStrength ("Reflection Strength", Range(0.0,2.0)) = 1.0
- _EnvironmentLight ("Environment Light", Range(0.0,2.0)) = 1.0
- _Emission ("Emission", Range(0.0,2.0)) = 0.0
- [NoScaleOffset] _RefractTex ("Refraction Texture", Cube) = "" {}
- }
- SubShader {
- Tags {
- "Queue" = "Transparent"
- }
- // First pass - here we render the backfaces of the diamonds. Since those diamonds are more-or-less
- // convex objects, this is effectively rendering the inside of them.
- Pass {
- Cull Front
- ZWrite Off
- CGPROGRAM
- #pragma vertex vert
- #pragma fragment frag
- #include "UnityCG.cginc"
-
- struct v2f {
- float4 pos : SV_POSITION;
- float3 uv : TEXCOORD0;
- };
- v2f vert (float4 v : POSITION, float3 n : NORMAL)
- {
- v2f o;
- o.pos = UnityObjectToClipPos(v);
- // TexGen CubeReflect:
- // reflect view direction along the normal, in view space.
- float3 viewDir = normalize(ObjSpaceViewDir(v));
- o.uv = -reflect(viewDir, n);
- o.uv = mul(unity_ObjectToWorld, float4(o.uv,0));
- return o;
- }
- fixed4 _Color;
- samplerCUBE _RefractTex;
- half _EnvironmentLight;
- half _Emission;
- half4 frag (v2f i) : SV_Target
- {
- half3 refraction = texCUBE(_RefractTex, i.uv).rgb * _Color.rgb;
- half4 reflection = UNITY_SAMPLE_TEXCUBE(unity_SpecCube0, i.uv);
- reflection.rgb = DecodeHDR (reflection, unity_SpecCube0_HDR);
- half3 multiplier = reflection.rgb * _EnvironmentLight + _Emission;
- return half4(refraction.rgb * multiplier.rgb, 1.0f);
- }
- ENDCG
- }
- // Second pass - here we render the front faces of the diamonds.
- Pass {
- ZWrite On
- Blend One One
-
- CGPROGRAM
- #pragma vertex vert
- #pragma fragment frag
- #include "UnityCG.cginc"
-
- struct v2f {
- float4 pos : SV_POSITION;
- float3 uv : TEXCOORD0;
- half fresnel : TEXCOORD1;
- };
- v2f vert (float4 v : POSITION, float3 n : NORMAL)
- {
- v2f o;
- o.pos = UnityObjectToClipPos(v);
- // TexGen CubeReflect:
- // reflect view direction along the normal, in view space.
- float3 viewDir = normalize(ObjSpaceViewDir(v));
- o.uv = -reflect(viewDir, n);
- o.uv = mul(unity_ObjectToWorld, float4(o.uv,0));
- o.fresnel = 1.0 - saturate(dot(n,viewDir));
- return o;
- }
- fixed4 _Color;
- samplerCUBE _RefractTex;
- half _ReflectionStrength;
- half _EnvironmentLight;
- half _Emission;
- half4 frag (v2f i) : SV_Target
- {
- half3 refraction = texCUBE(_RefractTex, i.uv).rgb * _Color.rgb;
- half4 reflection = UNITY_SAMPLE_TEXCUBE(unity_SpecCube0, i.uv);
- reflection.rgb = DecodeHDR (reflection, unity_SpecCube0_HDR);
- half3 reflection2 = reflection * _ReflectionStrength * i.fresnel;
- half3 multiplier = reflection.rgb * _EnvironmentLight + _Emission;
- return fixed4(reflection2 + refraction.rgb * multiplier, 1.0f);
- }
- ENDCG
- }
- // Shadow casting & depth texture support -- so that gems can
- // cast shadows
- UsePass "VertexLit/SHADOWCASTER"
- }
- }
|