Surface.shader 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317
  1. // Upgrade NOTE: replaced '_Object2World' with 'unity_ObjectToWorld'
  2. // Upgrade NOTE: replaced '_World2Object' with 'unity_WorldToObject'
  3. Shader "FORGE3D/Surface" {
  4. Properties {
  5. _Diffuse ("Diffuse", 2D) = "black" {}
  6. _Normal ("Normal", 2D) = "white" {}
  7. _Cubemap ("Cubemap", Cube) = "_Skybox" {}
  8. _Glow ("Glowmap", 2D) = "black" {}
  9. _DiffusePower ("Diffuse Power", Float) = 1
  10. _SpecularAdd ("Specular Add", Float) = 0
  11. _SpecularMult ("Specular Mult", Float) = 0
  12. _SpecularA ("Specular A", Float) = 0
  13. _SpecularB ("Specular B", Float) = 1
  14. _SpecularRatio ("Specular Ratio", Float) = 5.276861
  15. _ReflectionMult ("Reflection Mult", Float) = 0
  16. _ReflectionDesaturation ("Reflection Desaturation", Float) = 0
  17. _FresnelPower ("Fresnel Power", Float) = 0
  18. _FresnelMult ("Fresnel Mult", Float) = 0
  19. _GlowMult ("Glow", Float) = 0
  20. }
  21. SubShader
  22. {
  23. Tags
  24. {
  25. "RenderType"="Opaque"
  26. }
  27. LOD 200
  28. Pass
  29. {
  30. Name "ForwardBase"
  31. Tags
  32. {
  33. "LightMode"="ForwardBase"
  34. }
  35. CGPROGRAM
  36. #pragma vertex vert
  37. #pragma fragment frag
  38. #define UNITY_PASS_FORWARDBASE
  39. #include "UnityCG.cginc"
  40. #include "AutoLight.cginc"
  41. #pragma multi_compile_fwdbase_fullshadows
  42. #pragma exclude_renderers xbox360 ps3 flash d3d11_9x
  43. #pragma target 3.0
  44. uniform float4 _LightColor0;
  45. uniform sampler2D _Normal; uniform float4 _Normal_ST;
  46. uniform sampler2D _Diffuse; uniform float4 _Diffuse_ST;
  47. uniform sampler2D _Glow; uniform float4 _Glow_ST;
  48. uniform samplerCUBE _Cubemap;
  49. uniform float _DiffusePower;
  50. uniform float _SpecularRatio;
  51. uniform float _SpecularA;
  52. uniform float _SpecularB;
  53. uniform float _SpecularMult;
  54. uniform float _SpecularAdd;
  55. uniform float _ReflectionMult;
  56. uniform float _ReflectionDesaturation;
  57. uniform float _FresnelPower;
  58. uniform float _FresnelMult;
  59. uniform float _GlowMult;
  60. struct VertexInput
  61. {
  62. float4 vertex : POSITION;
  63. float3 normal : NORMAL;
  64. float4 tangent : TANGENT;
  65. float2 texcoord0 : TEXCOORD0;
  66. };
  67. struct VertexOutput
  68. {
  69. float4 pos : SV_POSITION;
  70. float2 uv0 : TEXCOORD0;
  71. float4 posWorld : TEXCOORD1;
  72. float3 normalDir : TEXCOORD2;
  73. float3 tangentDir : TEXCOORD3;
  74. float3 binormalDir : TEXCOORD4;
  75. LIGHTING_COORDS(5,6)
  76. };
  77. // Vertex
  78. VertexOutput vert (VertexInput v)
  79. {
  80. VertexOutput o;
  81. o.uv0 = TRANSFORM_TEX( v.texcoord0, _Diffuse );
  82. o.normalDir = mul(float4(v.normal,0), unity_WorldToObject).xyz;
  83. o.tangentDir = normalize( mul( unity_ObjectToWorld, float4( v.tangent.xyz, 0.0 ) ).xyz );
  84. o.binormalDir = normalize(cross(o.normalDir, o.tangentDir) * v.tangent.w);
  85. o.posWorld = mul(unity_ObjectToWorld, v.vertex);
  86. o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
  87. TRANSFER_VERTEX_TO_FRAGMENT(o)
  88. return o;
  89. }
  90. // Spherical Gaussian Power Function
  91. float powx(float x, float n)
  92. {
  93. n = n * 1.4427f + 1.4427f;
  94. return exp2(x * n - n);
  95. }
  96. // Desaturate
  97. float Desaturate(float3 color)
  98. {
  99. return color.r * 0.299 + color.g * 0.587 + color.b * 0.114;
  100. }
  101. // Fragment
  102. float4 frag(VertexOutput i) : COLOR
  103. {
  104. // normal and transforms
  105. i.normalDir = normalize(i.normalDir);
  106. float3x3 tangentTransform = float3x3( i.tangentDir, i.binormalDir, i.normalDir);
  107. // normal calculation
  108. float4 normalMap = tex2D(_Normal, i.uv0);
  109. float2 n = ((float2(normalMap.g,normalMap.a).rg*2.0)-1.0).rg;
  110. float3 normalLocal = mul( tangentTransform, normalize((normalize(i.normalDir)+(normalize(i.tangentDir)*n.g)+(normalize(i.binormalDir)*n.r))) ).xyz.rgb;
  111. float3 normalDir = normalize(mul( normalLocal, tangentTransform ));
  112. // light
  113. float3 lightDir = normalize(_WorldSpaceLightPos0.xyz);
  114. float attenuation = LIGHT_ATTENUATION(i);
  115. float3 ambient = UNITY_LIGHTMODEL_AMBIENT.rgb;
  116. // view, half, reflect
  117. float3 viewDir = normalize(_WorldSpaceCameraPos.xyz - i.posWorld.xyz);
  118. float3 reflectDir = reflect( -viewDir, normalDir );
  119. float3 halfDir = normalize(viewDir + lightDir);
  120. float4 diffuseMap = tex2D(_Diffuse, i.uv0);
  121. float ndl = pow(saturate(dot(normalDir, lightDir)), _DiffusePower);
  122. float specDot = max(0.0, dot(normalDir, halfDir));
  123. float spec = max(0, _SpecularRatio) * powx(specDot, max(0, _SpecularA)) + powx(specDot, max(0, _SpecularB)) * diffuseMap.a;
  124. spec = saturate(spec) * ndl * attenuation;
  125. float3 diffuse = (diffuseMap.rgb * attenuation) *
  126. ((ndl + _SpecularMult * spec) * _LightColor0.rgb) +
  127. _SpecularAdd * spec * _LightColor0.rgb;
  128. float3 fresnel = saturate(powx(saturate(1 - abs(dot(viewDir, normalDir))), _FresnelPower) * _FresnelMult) * diffuseMap.a * _LightColor0.rgb;
  129. float4 cubeMap = texCUBE(_Cubemap, reflectDir);
  130. float dCubeMap = Desaturate(cubeMap.rgb);
  131. float3 reflection = max(0.0, _ReflectionMult) * lerp(dCubeMap.xxx, cubeMap.rgb, saturate(_ReflectionDesaturation)) * diffuseMap.a;
  132. float4 glowMap = tex2D(_Glow, i.uv0);
  133. float3 glowColor = glowMap.rgb * _GlowMult;
  134. float3 ambientColor = (diffuseMap.rgb * ambient);
  135. float3 finalColor = ambientColor + diffuse + reflection + fresnel + glowColor;
  136. return float4(finalColor,1);
  137. }
  138. ENDCG
  139. }
  140. Pass
  141. {
  142. Name "ForwardAdd"
  143. Tags
  144. {
  145. "LightMode"="ForwardAdd"
  146. }
  147. Blend One One
  148. CGPROGRAM
  149. #pragma vertex vert
  150. #pragma fragment frag
  151. #define UNITY_PASS_FORWARDADD
  152. #include "UnityCG.cginc"
  153. #include "AutoLight.cginc"
  154. #pragma multi_compile_fwdadd_fullshadows
  155. #pragma exclude_renderers xbox360 ps3 flash d3d11_9x
  156. #pragma target 3.0
  157. uniform float4 _LightColor0;
  158. uniform sampler2D _Normal; uniform float4 _Normal_ST;
  159. uniform sampler2D _Diffuse; uniform float4 _Diffuse_ST;
  160. uniform sampler2D _Glow; uniform float4 _Glow_ST;
  161. uniform samplerCUBE _Cubemap;
  162. uniform float _DiffusePower;
  163. uniform float _SpecularRatio;
  164. uniform float _SpecularA;
  165. uniform float _SpecularB;
  166. uniform float _SpecularMult;
  167. uniform float _SpecularAdd;
  168. uniform float _ReflectionMult;
  169. uniform float _ReflectionDesaturation;
  170. uniform float _FresnelPower;
  171. uniform float _FresnelMult;
  172. uniform float4 _GlowColor;
  173. uniform float _HullGlow;
  174. uniform float _EngGlow;
  175. struct VertexInput
  176. {
  177. float4 vertex : POSITION;
  178. float3 normal : NORMAL;
  179. float4 tangent : TANGENT;
  180. float2 texcoord0 : TEXCOORD0;
  181. };
  182. struct VertexOutput
  183. {
  184. float4 pos : SV_POSITION;
  185. float2 uv0 : TEXCOORD0;
  186. float4 posWorld : TEXCOORD1;
  187. float3 normalDir : TEXCOORD2;
  188. float3 tangentDir : TEXCOORD3;
  189. float3 binormalDir : TEXCOORD4;
  190. LIGHTING_COORDS(5,6)
  191. };
  192. VertexOutput vert (VertexInput v)
  193. {
  194. VertexOutput o;
  195. o.uv0 = TRANSFORM_TEX( v.texcoord0, _Diffuse );
  196. o.normalDir = mul(float4(v.normal,0), unity_WorldToObject).xyz;
  197. o.tangentDir = normalize( mul( unity_ObjectToWorld, float4( v.tangent.xyz, 0.0 ) ).xyz );
  198. o.binormalDir = normalize(cross(o.normalDir, o.tangentDir) * v.tangent.w);
  199. o.posWorld = mul(unity_ObjectToWorld, v.vertex);
  200. o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
  201. TRANSFER_VERTEX_TO_FRAGMENT(o)
  202. return o;
  203. }
  204. // Spherical Gaussian Power Function
  205. float powx(float x, float n)
  206. {
  207. n = n * 1.4427f + 1.4427f;
  208. return exp2(x * n - n);
  209. }
  210. // Desaturate
  211. float Desaturate(float3 color)
  212. {
  213. return color.r * 0.299 + color.g * 0.587 + color.b * 0.114;
  214. }
  215. float4 frag(VertexOutput i) : COLOR
  216. {
  217. // normal and transforms
  218. i.normalDir = normalize(i.normalDir);
  219. float3x3 tangentTransform = float3x3( i.tangentDir, i.binormalDir, i.normalDir);
  220. // normal calculation
  221. float4 normalMap = tex2D(_Normal, i.uv0);
  222. float2 n = ((float2(normalMap.g,normalMap.a).rg*2.0)-1.0).rg;
  223. float3 normalLocal = mul( tangentTransform, normalize((normalize(i.normalDir)+(normalize(i.tangentDir)*n.g)+(normalize(i.binormalDir)*n.r))) ).xyz.rgb;
  224. float3 normalDir = normalize(mul( normalLocal, tangentTransform ));
  225. // light
  226. float3 lightDir = normalize(lerp(_WorldSpaceLightPos0.xyz, _WorldSpaceLightPos0.xyz - i.posWorld.xyz,_WorldSpaceLightPos0.w));
  227. float attenuation = LIGHT_ATTENUATION(i);
  228. float3 ambient = UNITY_LIGHTMODEL_AMBIENT.rgb;
  229. // view, half, reflect
  230. float3 viewDir = normalize(_WorldSpaceCameraPos.xyz - i.posWorld.xyz);
  231. float3 reflectDir = reflect( -viewDir, normalDir );
  232. float3 halfDir = normalize(viewDir + lightDir);
  233. float4 diffuseMap = tex2D(_Diffuse, i.uv0);
  234. float ndl = max(0.0, pow(dot(normalDir, lightDir), _DiffusePower));
  235. float specDot = max(0.0, dot(normalDir, halfDir));
  236. float spec = max(0, _SpecularRatio) * powx(specDot, max(0, _SpecularA)) + powx(specDot, max(0, _SpecularB)) * diffuseMap.a;
  237. spec = saturate(spec) * ndl;
  238. float3 diffuse = (diffuseMap.rgb * attenuation) *
  239. ((ndl + _SpecularMult * spec) * _LightColor0.rgb) +
  240. _SpecularAdd * spec * _LightColor0.rgb;
  241. float3 fresnel = saturate(powx(saturate(1 - abs(dot(viewDir, normalDir))), _FresnelPower) * _FresnelMult) * diffuseMap.a * _LightColor0.rgb;
  242. float4 cubeMap = texCUBE(_Cubemap, reflectDir);
  243. float dCubeMap = Desaturate(cubeMap.rgb);
  244. float3 reflection = max(0.0, _ReflectionMult) * lerp(dCubeMap.xxx, cubeMap.rgb, saturate(_ReflectionDesaturation)) * diffuseMap.a;
  245. float3 ambientColor = (diffuseMap.rgb * ambient);
  246. float3 finalColor = saturate((diffuse + fresnel) * attenuation * _LightColor0.rgb);
  247. return float4(finalColor, 1);
  248. }
  249. ENDCG
  250. }
  251. }
  252. FallBack "Diffuse"
  253. }