123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315 |
- // Upgrade NOTE: replaced '_Object2World' with 'unity_ObjectToWorld'
- // Upgrade NOTE: replaced '_World2Object' with 'unity_WorldToObject'
- Shader "FORGE3D/Debris" {
- Properties {
- _Diffuse ("Diffuse", 2D) = "black" {}
- _Normal ("Normal", 2D) = "white" {}
- _Specular ("Specular", 2D) = "white" {}
-
- _DiffusePower ("Diffuse Power", Float) = 1
- _SpecularAdd ("Specular Add", Float) = 0
- _SpecularMult ("Specular Mult", Float) = 0
- _SpecularA ("Specular A", Float) = 0
- _SpecularB ("Specular B", Float) = 1
- _SpecularRatio ("Specular Ratio", Float) = 5.276861
-
- _FresnelPower ("Fresnel Power", Float) = 0
- _FresnelMult ("Fresnel Mult", Float) = 0
- _InMinMaxOutMinMax ("In(Min/Max) - Out(Min/Max)", Vector) = (0,0,0,0)
-
- }
- SubShader
- {
- Tags {
- "IgnoreProjector"="True"
- "Queue"="Transparent"
- "RenderType"="Transparent"
- }
- LOD 200
- Pass
- {
-
- Blend SrcAlpha OneMinusSrcAlpha
- ZWrite Off
- Name "ForwardBase"
- Tags {
- "LightMode"="ForwardBase"
- }
- CGPROGRAM
- #pragma vertex vert
- #pragma fragment frag
- #define UNITY_PASS_FORWARDBASE
- #pragma multi_compile_fwdbase
- #include "UnityCG.cginc"
- #include "AutoLight.cginc"
-
- #pragma exclude_renderers xbox360 ps3 flash d3d11_9x
- #pragma target 3.0
- uniform float4 _LightColor0;
- uniform sampler2D _Normal; uniform float4 _Normal_ST;
- uniform sampler2D _Diffuse; uniform float4 _Diffuse_ST;
- uniform sampler2D _Specular; uniform float4 _Specular_ST;
- uniform float _DiffusePower;
- uniform float _SpecularRatio;
- uniform float _SpecularA;
- uniform float _SpecularB;
- uniform float _SpecularMult;
- uniform float _SpecularAdd;
-
- uniform float _ReflectionMult;
- uniform float _ReflectionDesaturation;
- uniform float _FresnelPower;
- uniform float _FresnelMult;
-
- uniform float4 _InMinMaxOutMinMax;
- struct VertexInput
- {
- float4 vertex : POSITION;
- float3 normal : NORMAL;
- float4 tangent : TANGENT;
- float2 texcoord0 : TEXCOORD0;
- };
- struct VertexOutput
- {
- float4 pos : SV_POSITION;
- float2 uv0 : TEXCOORD0;
- float4 posWorld : TEXCOORD1;
- float3 normalDir : TEXCOORD2;
- float3 tangentDir : TEXCOORD3;
- float3 binormalDir : TEXCOORD4;
- LIGHTING_COORDS(5,6)
- };
- // Vertex
- VertexOutput vert (VertexInput v)
- {
- VertexOutput o;
- o.uv0 = TRANSFORM_TEX( v.texcoord0, _Diffuse );
- o.normalDir = mul(float4(v.normal,0), unity_WorldToObject).xyz;
- o.tangentDir = normalize( mul( unity_ObjectToWorld, float4( v.tangent.xyz, 0.0 ) ).xyz );
- o.binormalDir = normalize(cross(o.normalDir, o.tangentDir) * v.tangent.w);
- o.posWorld = mul(unity_ObjectToWorld, v.vertex);
- o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
- TRANSFER_VERTEX_TO_FRAGMENT(o)
- return o;
- }
- float Fade( float length , float outMin , float outMax , float inMin , float inMax )
- {
- return smoothstep(0, 1, 1 - ((length - outMin) / (outMax - outMin)))-
- smoothstep(0, 1, 1 - ((length - inMin) / (inMax - inMin)));
- }
- // Spherical Gaussian Power Function
- float powx(float x, float n)
- {
- n = n * 1.4427f + 1.4427f;
- return exp2(x * n - n);
- }
- // Desaturate
- float Desaturate(float3 color)
- {
- return color.r * 0.299 + color.g * 0.587 + color.b * 0.114;
- }
- // Fragment
- float4 frag(VertexOutput i) : COLOR
- {
- // normal and transforms
- i.normalDir = normalize(i.normalDir);
- float3x3 tangentTransform = float3x3( i.tangentDir, i.binormalDir, i.normalDir);
-
- // normal calculation
- float4 normalMap = tex2D(_Normal, i.uv0);
- float4 specMap = tex2D(_Specular, i.uv0);
- float2 n = ((float2(normalMap.g,normalMap.a).rg*2.0)-1.0).rg;
- float3 normalLocal = mul( tangentTransform, normalize((normalize(i.normalDir)+(normalize(i.tangentDir)*n.g)+(normalize(i.binormalDir)*n.r))) ).xyz.rgb;
- float3 normalDir = normalize(mul( normalLocal, tangentTransform ));
- // light
- float3 lightDir = normalize(_WorldSpaceLightPos0.xyz);
- float attenuation = LIGHT_ATTENUATION(i);
- float3 ambient = UNITY_LIGHTMODEL_AMBIENT.rgb;
- // view, half, reflect
- float3 viewDir = normalize(_WorldSpaceCameraPos.xyz - i.posWorld.xyz);
- float3 reflectDir = reflect( -viewDir, normalDir );
- float3 halfDir = normalize(viewDir + lightDir);
- float4 diffuseMap = tex2D(_Diffuse, i.uv0);
- float ndl = pow(saturate(dot(normalDir, lightDir)), _DiffusePower);
- float specDot = max(0.0, dot(normalDir, halfDir));
- float spec = max(0, _SpecularRatio) * powx(specDot, max(0, _SpecularA)) + powx(specDot, max(0, _SpecularB)) * specMap;
- spec = saturate(spec) * ndl * attenuation;
- float3 diffuse = (diffuseMap.rgb * attenuation) *
- ((ndl + _SpecularMult * spec) * _LightColor0.rgb) +
- _SpecularAdd * spec * _LightColor0.rgb;
- float3 fresnel = powx(saturate(1 - abs(dot(viewDir, normalDir))), _FresnelPower) * _FresnelMult * specMap * _LightColor0.rgb;
-
- float3 ambientColor = diffuseMap.rgb * ambient * 5;
- float3 finalColor = ambientColor + diffuse + fresnel;
- float fade = Fade( distance(_WorldSpaceCameraPos.rgb,i.posWorld.rgb) , _InMinMaxOutMinMax.b , _InMinMaxOutMinMax.a , _InMinMaxOutMinMax.r , _InMinMaxOutMinMax.g );
- return float4(finalColor, fade);
- }
- ENDCG
- }
- Pass
- {
-
- Name "ForwardAdd"
- Tags {
- "LightMode"="ForwardAdd"
- }
- Blend One One
- ZWrite Off
- CGPROGRAM
- #pragma vertex vert
- #pragma fragment frag
- #define UNITY_PASS_FORWARDADD
- #pragma multi_compile_fwdadd
- #include "UnityCG.cginc"
- #include "AutoLight.cginc"
-
- #pragma exclude_renderers xbox360 ps3 flash d3d11_9x
- #pragma target 3.0
- uniform float4 _LightColor0;
- uniform sampler2D _Normal; uniform float4 _Normal_ST;
- uniform sampler2D _Diffuse; uniform float4 _Diffuse_ST;
- uniform sampler2D _Specular; uniform float4 _Specular_ST;
- uniform float _DiffusePower;
- uniform float _SpecularRatio;
- uniform float _SpecularA;
- uniform float _SpecularB;
- uniform float _SpecularMult;
- uniform float _SpecularAdd;
-
- uniform float _FresnelPower;
- uniform float _FresnelMult;
- uniform float4 _InMinMaxOutMinMax;
- struct VertexInput
- {
- float4 vertex : POSITION;
- float3 normal : NORMAL;
- float4 tangent : TANGENT;
- float2 texcoord0 : TEXCOORD0;
- };
- struct VertexOutput
- {
- float4 pos : SV_POSITION;
- float2 uv0 : TEXCOORD0;
- float4 posWorld : TEXCOORD1;
- float3 normalDir : TEXCOORD2;
- float3 tangentDir : TEXCOORD3;
- float3 binormalDir : TEXCOORD4;
- LIGHTING_COORDS(5,6)
- };
- VertexOutput vert (VertexInput v)
- {
- VertexOutput o;
- o.uv0 = TRANSFORM_TEX( v.texcoord0, _Diffuse );
- o.normalDir = mul(float4(v.normal,0), unity_WorldToObject).xyz;
- o.tangentDir = normalize( mul( unity_ObjectToWorld, float4( v.tangent.xyz, 0.0 ) ).xyz );
- o.binormalDir = normalize(cross(o.normalDir, o.tangentDir) * v.tangent.w);
- o.posWorld = mul(unity_ObjectToWorld, v.vertex);
- o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
- TRANSFER_VERTEX_TO_FRAGMENT(o)
- return o;
- }
- // Spherical Gaussian Power Function
- float powx(float x, float n)
- {
- n = n * 1.4427f + 1.4427f;
- return exp2(x * n - n);
- }
- // Desaturate
- float Desaturate(float3 color)
- {
- return color.r * 0.299 + color.g * 0.587 + color.b * 0.114;
- }
- float Fade( float length , float outMin , float outMax , float inMin , float inMax )
- {
- return smoothstep(0, 1, 1 - ((length - outMin) / (outMax - outMin)))-
- smoothstep(0, 1, 1 - ((length - inMin) / (inMax - inMin)));
- }
- float4 frag(VertexOutput i) : COLOR
- {
- // normal and transforms
- i.normalDir = normalize(i.normalDir);
- float3x3 tangentTransform = float3x3( i.tangentDir, i.binormalDir, i.normalDir);
-
- // normal calculation
- float4 normalMap = tex2D(_Normal, i.uv0);
- float2 n = ((float2(normalMap.g,normalMap.a).rg*2.0)-1.0).rg;
- float3 normalLocal = mul( tangentTransform, normalize((normalize(i.normalDir)+(normalize(i.tangentDir)*n.g)+(normalize(i.binormalDir)*n.r))) ).xyz.rgb;
- float3 normalDir = normalize(mul( normalLocal, tangentTransform ));
- // light
- float3 lightDir = normalize(lerp(_WorldSpaceLightPos0.xyz, _WorldSpaceLightPos0.xyz - i.posWorld.xyz,_WorldSpaceLightPos0.w));
- float attenuation = LIGHT_ATTENUATION(i);
- float3 ambient = UNITY_LIGHTMODEL_AMBIENT.rgb;
- // view, half, reflect
- float3 viewDir = normalize(_WorldSpaceCameraPos.xyz - i.posWorld.xyz);
- float3 reflectDir = reflect( -viewDir, normalDir );
- float3 halfDir = normalize(viewDir + lightDir);
- float4 diffuseMap = tex2D(_Diffuse, i.uv0);
- float4 specMap = tex2D(_Specular, i.uv0);
- float ndl = max(0.0, pow(dot(normalDir, lightDir), _DiffusePower));
- float specDot = max(0.0, dot(normalDir, halfDir));
- float3 spec = max(0, _SpecularRatio) * powx(specDot, max(0, _SpecularA)) + powx(specDot, max(0, _SpecularB)) * specMap;
- spec = saturate(spec) * ndl;
- float3 diffuse = (diffuseMap.rgb * attenuation) *
- ((ndl + _SpecularMult * spec) * _LightColor0.rgb) +
- _SpecularAdd * spec * _LightColor0.rgb;
- float3 fresnel = powx(saturate(1 - abs(dot(viewDir, normalDir))), _FresnelPower) * _FresnelMult * specMap * _LightColor0.rgb;
-
- float3 ambientColor = diffuseMap.rgb * ambient;
- float3 finalColor = saturate((diffuse + fresnel) * attenuation * _LightColor0.rgb);
- float fade = Fade( distance(_WorldSpaceCameraPos.rgb,i.posWorld.rgb) , _InMinMaxOutMinMax.b , _InMinMaxOutMinMax.a , _InMinMaxOutMinMax.r , _InMinMaxOutMinMax.g );
- return float4(finalColor * fade, 0);
-
- }
- ENDCG
- }
- }
- // FallBack "Diffuse"
-
- }
|