Advertisement
Guest User

Untitled

a guest
May 24th, 2018
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 19.66 KB | None | 0 0
  1. Shader "FresnelGradient" {
  2. Properties {
  3. _FrontColor ("FrontColor", Color) = (1,0,0,1)
  4. _BackColor ("Back Color", Color) = (0,0,1,1)
  5. _GradientPower ("GradientPower", Range(0, 10)) = 1
  6. _Metallic ("Metallic", Range(0, 1)) = 0
  7. _Roughness ("Roughness", Range(0, 1)) = 0
  8. _FresnelColor ("Fresnel Color", Color) = (0,0.9568628,1,1)
  9. _FresnelPower ("Fresnel Power", Range(0, 10)) = 1
  10. }
  11. SubShader {
  12. Tags {
  13. "RenderType"="Opaque"
  14. }
  15. Pass {
  16. Name "FORWARD"
  17. Tags {
  18. "LightMode"="ForwardBase"
  19. }
  20.  
  21.  
  22. CGPROGRAM
  23. #pragma vertex vert
  24. #pragma fragment frag
  25. #define UNITY_PASS_FORWARDBASE
  26. #define SHOULD_SAMPLE_SH ( defined (LIGHTMAP_OFF) && defined(DYNAMICLIGHTMAP_OFF) )
  27. #define _GLOSSYENV 1
  28. #include "UnityCG.cginc"
  29. #include "AutoLight.cginc"
  30. #include "Lighting.cginc"
  31. #include "UnityPBSLighting.cginc"
  32. #include "UnityStandardBRDF.cginc"
  33. #pragma multi_compile_fwdbase_fullshadows
  34. #pragma multi_compile LIGHTMAP_OFF LIGHTMAP_ON
  35. #pragma multi_compile DIRLIGHTMAP_OFF DIRLIGHTMAP_COMBINED DIRLIGHTMAP_SEPARATE
  36. #pragma multi_compile DYNAMICLIGHTMAP_OFF DYNAMICLIGHTMAP_ON
  37. #pragma multi_compile_fog
  38. #pragma only_renderers d3d9 d3d11 glcore gles
  39. #pragma target 3.0
  40. uniform float4 _BackColor;
  41. uniform float _FresnelPower;
  42. uniform float4 _FresnelColor;
  43. uniform float _Metallic;
  44. uniform float _Roughness;
  45. uniform float4 _FrontColor;
  46. uniform float _GradientPower;
  47. struct VertexInput {
  48. float4 vertex : POSITION;
  49. float3 normal : NORMAL;
  50. float4 tangent : TANGENT;
  51. float2 texcoord1 : TEXCOORD1;
  52. float2 texcoord2 : TEXCOORD2;
  53. };
  54. struct VertexOutput {
  55. float4 pos : SV_POSITION;
  56. float2 uv1 : TEXCOORD0;
  57. float2 uv2 : TEXCOORD1;
  58. float4 posWorld : TEXCOORD2;
  59. float3 normalDir : TEXCOORD3;
  60. float3 tangentDir : TEXCOORD4;
  61. float3 bitangentDir : TEXCOORD5;
  62. LIGHTING_COORDS(6,7)
  63. UNITY_FOG_COORDS(8)
  64. #if defined(LIGHTMAP_ON) || defined(UNITY_SHOULD_SAMPLE_SH)
  65. float4 ambientOrLightmapUV : TEXCOORD9;
  66. #endif
  67. };
  68. VertexOutput vert (VertexInput v) {
  69. VertexOutput o = (VertexOutput)0;
  70. o.uv1 = v.texcoord1;
  71. o.uv2 = v.texcoord2;
  72. #ifdef LIGHTMAP_ON
  73. o.ambientOrLightmapUV.xy = v.texcoord1.xy * unity_LightmapST.xy + unity_LightmapST.zw;
  74. o.ambientOrLightmapUV.zw = 0;
  75. #elif UNITY_SHOULD_SAMPLE_SH
  76. #endif
  77. #ifdef DYNAMICLIGHTMAP_ON
  78. o.ambientOrLightmapUV.zw = v.texcoord2.xy * unity_DynamicLightmapST.xy + unity_DynamicLightmapST.zw;
  79. #endif
  80. o.normalDir = UnityObjectToWorldNormal(v.normal);
  81. o.tangentDir = normalize( mul( unity_ObjectToWorld, float4( v.tangent.xyz, 0.0 ) ).xyz );
  82. o.bitangentDir = normalize(cross(o.normalDir, o.tangentDir) * v.tangent.w);
  83. o.posWorld = mul(unity_ObjectToWorld, v.vertex);
  84. float3 lightColor = _LightColor0.rgb;
  85. o.pos = UnityObjectToClipPos( v.vertex );
  86. UNITY_TRANSFER_FOG(o,o.pos);
  87. TRANSFER_VERTEX_TO_FRAGMENT(o)
  88. return o;
  89. }
  90. float4 frag(VertexOutput i) : COLOR {
  91. i.normalDir = normalize(i.normalDir);
  92. float3x3 tangentTransform = float3x3( i.tangentDir, i.bitangentDir, i.normalDir);
  93. float3 viewDirection = normalize(_WorldSpaceCameraPos.xyz - i.posWorld.xyz);
  94. float3 normalDirection = i.normalDir;
  95. float3 viewReflectDirection = reflect( -viewDirection, normalDirection );
  96. float3 lightDirection = normalize(_WorldSpaceLightPos0.xyz);
  97. float3 lightColor = _LightColor0.rgb;
  98. float3 halfDirection = normalize(viewDirection+lightDirection);
  99. ////// Lighting:
  100. float attenuation = LIGHT_ATTENUATION(i);
  101. float3 attenColor = attenuation * _LightColor0.xyz;
  102. float Pi = 3.141592654;
  103. float InvPi = 0.31830988618;
  104. ///////// Gloss:
  105. float gloss = _Roughness;
  106. float perceptualRoughness = 1.0 - _Roughness;
  107. float roughness = perceptualRoughness * perceptualRoughness;
  108. float specPow = exp2( gloss * 10.0 + 1.0 );
  109. /////// GI Data:
  110. UnityLight light;
  111. #ifdef LIGHTMAP_OFF
  112. light.color = lightColor;
  113. light.dir = lightDirection;
  114. light.ndotl = LambertTerm (normalDirection, light.dir);
  115. #else
  116. light.color = half3(0.f, 0.f, 0.f);
  117. light.ndotl = 0.0f;
  118. light.dir = half3(0.f, 0.f, 0.f);
  119. #endif
  120. UnityGIInput d;
  121. d.light = light;
  122. d.worldPos = i.posWorld.xyz;
  123. d.worldViewDir = viewDirection;
  124. d.atten = attenuation;
  125. #if defined(LIGHTMAP_ON) || defined(DYNAMICLIGHTMAP_ON)
  126. d.ambient = 0;
  127. d.lightmapUV = i.ambientOrLightmapUV;
  128. #else
  129. d.ambient = i.ambientOrLightmapUV;
  130. #endif
  131. #if UNITY_SPECCUBE_BLENDING || UNITY_SPECCUBE_BOX_PROJECTION
  132. d.boxMin[0] = unity_SpecCube0_BoxMin;
  133. d.boxMin[1] = unity_SpecCube1_BoxMin;
  134. #endif
  135. #if UNITY_SPECCUBE_BOX_PROJECTION
  136. d.boxMax[0] = unity_SpecCube0_BoxMax;
  137. d.boxMax[1] = unity_SpecCube1_BoxMax;
  138. d.probePosition[0] = unity_SpecCube0_ProbePosition;
  139. d.probePosition[1] = unity_SpecCube1_ProbePosition;
  140. #endif
  141. d.probeHDR[0] = unity_SpecCube0_HDR;
  142. d.probeHDR[1] = unity_SpecCube1_HDR;
  143. Unity_GlossyEnvironmentData ugls_en_data;
  144. ugls_en_data.roughness = 1.0 - gloss;
  145. ugls_en_data.reflUVW = viewReflectDirection;
  146. UnityGI gi = UnityGlobalIllumination(d, 1, normalDirection, ugls_en_data );
  147. lightDirection = gi.light.dir;
  148. lightColor = gi.light.color;
  149. ////// Specular:
  150. float NdotL = saturate(dot( normalDirection, lightDirection ));
  151. float LdotH = saturate(dot(lightDirection, halfDirection));
  152. float3 specularColor = _Metallic;
  153. float specularMonochrome;
  154. float3 diffuseColor = lerp(_FrontColor.rgb,_BackColor.rgb,(1.0 - pow(1.0-max(0,dot(normalDirection, viewDirection)),_GradientPower))); // Need this for specular when using metallic
  155. diffuseColor = DiffuseAndSpecularFromMetallic( diffuseColor, specularColor, specularColor, specularMonochrome );
  156. specularMonochrome = 1.0-specularMonochrome;
  157. float NdotV = abs(dot( normalDirection, viewDirection ));
  158. float NdotH = saturate(dot( normalDirection, halfDirection ));
  159. float VdotH = saturate(dot( viewDirection, halfDirection ));
  160. float visTerm = SmithJointGGXVisibilityTerm( NdotL, NdotV, roughness );
  161. float normTerm = GGXTerm(NdotH, roughness);
  162. float specularPBL = (visTerm*normTerm) * UNITY_PI;
  163. #ifdef UNITY_COLORSPACE_GAMMA
  164. specularPBL = sqrt(max(1e-4h, specularPBL));
  165. #endif
  166. specularPBL = max(0, specularPBL * NdotL);
  167. #if defined(_SPECULARHIGHLIGHTS_OFF)
  168. specularPBL = 0.0;
  169. #endif
  170. half surfaceReduction;
  171. #ifdef UNITY_COLORSPACE_GAMMA
  172. surfaceReduction = 1.0-0.28*roughness*perceptualRoughness;
  173. #else
  174. surfaceReduction = 1.0/(roughness*roughness + 1.0);
  175. #endif
  176. specularPBL *= any(specularColor) ? 1.0 : 0.0;
  177. float3 directSpecular = attenColor*specularPBL*FresnelTerm(specularColor, LdotH);
  178. half grazingTerm = saturate( gloss + specularMonochrome );
  179. float3 indirectSpecular = (gi.indirect.specular);
  180. indirectSpecular *= FresnelLerp (specularColor, grazingTerm, NdotV);
  181. indirectSpecular *= surfaceReduction;
  182. float3 specular = (directSpecular + indirectSpecular);
  183. /////// Diffuse:
  184. NdotL = max(0.0,dot( normalDirection, lightDirection ));
  185. half fd90 = 0.5 + 2 * LdotH * LdotH * (1-gloss);
  186. float nlPow5 = Pow5(1-NdotL);
  187. float nvPow5 = Pow5(1-NdotV);
  188. float3 directDiffuse = ((1 +(fd90 - 1)*nlPow5) * (1 + (fd90 - 1)*nvPow5) * NdotL) * attenColor;
  189. float3 indirectDiffuse = float3(0,0,0);
  190. indirectDiffuse += gi.indirect.diffuse;
  191. float3 diffuse = (directDiffuse + indirectDiffuse) * diffuseColor;
  192. ////// Emissive:
  193. float3 emissive = (_FresnelColor.rgb*pow(1.0-max(0,dot(normalDirection, viewDirection)),_FresnelPower));
  194. /// Final Color:
  195. float3 finalColor = diffuse + specular + emissive;
  196. fixed4 finalRGBA = fixed4(finalColor,1);
  197. UNITY_APPLY_FOG(i.fogCoord, finalRGBA);
  198. return finalRGBA;
  199. }
  200. ENDCG
  201. }
  202. Pass {
  203. Name "FORWARD_DELTA"
  204. Tags {
  205. "LightMode"="ForwardAdd"
  206. }
  207. Blend One One
  208.  
  209.  
  210. CGPROGRAM
  211. #pragma vertex vert
  212. #pragma fragment frag
  213. #define UNITY_PASS_FORWARDADD
  214. #define SHOULD_SAMPLE_SH ( defined (LIGHTMAP_OFF) && defined(DYNAMICLIGHTMAP_OFF) )
  215. #define _GLOSSYENV 1
  216. #include "UnityCG.cginc"
  217. #include "AutoLight.cginc"
  218. #include "Lighting.cginc"
  219. #include "UnityPBSLighting.cginc"
  220. #include "UnityStandardBRDF.cginc"
  221. #pragma multi_compile_fwdadd_fullshadows
  222. #pragma multi_compile LIGHTMAP_OFF LIGHTMAP_ON
  223. #pragma multi_compile DIRLIGHTMAP_OFF DIRLIGHTMAP_COMBINED DIRLIGHTMAP_SEPARATE
  224. #pragma multi_compile DYNAMICLIGHTMAP_OFF DYNAMICLIGHTMAP_ON
  225. #pragma multi_compile_fog
  226. #pragma only_renderers d3d9 d3d11 glcore gles
  227. #pragma target 3.0
  228. uniform float4 _BackColor;
  229. uniform float _FresnelPower;
  230. uniform float4 _FresnelColor;
  231. uniform float _Metallic;
  232. uniform float _Roughness;
  233. uniform float4 _FrontColor;
  234. uniform float _GradientPower;
  235. struct VertexInput {
  236. float4 vertex : POSITION;
  237. float3 normal : NORMAL;
  238. float4 tangent : TANGENT;
  239. float2 texcoord1 : TEXCOORD1;
  240. float2 texcoord2 : TEXCOORD2;
  241. };
  242. struct VertexOutput {
  243. float4 pos : SV_POSITION;
  244. float2 uv1 : TEXCOORD0;
  245. float2 uv2 : TEXCOORD1;
  246. float4 posWorld : TEXCOORD2;
  247. float3 normalDir : TEXCOORD3;
  248. float3 tangentDir : TEXCOORD4;
  249. float3 bitangentDir : TEXCOORD5;
  250. LIGHTING_COORDS(6,7)
  251. UNITY_FOG_COORDS(8)
  252. };
  253. VertexOutput vert (VertexInput v) {
  254. VertexOutput o = (VertexOutput)0;
  255. o.uv1 = v.texcoord1;
  256. o.uv2 = v.texcoord2;
  257. o.normalDir = UnityObjectToWorldNormal(v.normal);
  258. o.tangentDir = normalize( mul( unity_ObjectToWorld, float4( v.tangent.xyz, 0.0 ) ).xyz );
  259. o.bitangentDir = normalize(cross(o.normalDir, o.tangentDir) * v.tangent.w);
  260. o.posWorld = mul(unity_ObjectToWorld, v.vertex);
  261. float3 lightColor = _LightColor0.rgb;
  262. o.pos = UnityObjectToClipPos( v.vertex );
  263. UNITY_TRANSFER_FOG(o,o.pos);
  264. TRANSFER_VERTEX_TO_FRAGMENT(o)
  265. return o;
  266. }
  267. float4 frag(VertexOutput i) : COLOR {
  268. i.normalDir = normalize(i.normalDir);
  269. float3x3 tangentTransform = float3x3( i.tangentDir, i.bitangentDir, i.normalDir);
  270. float3 viewDirection = normalize(_WorldSpaceCameraPos.xyz - i.posWorld.xyz);
  271. float3 normalDirection = i.normalDir;
  272. float3 lightDirection = normalize(lerp(_WorldSpaceLightPos0.xyz, _WorldSpaceLightPos0.xyz - i.posWorld.xyz,_WorldSpaceLightPos0.w));
  273. float3 lightColor = _LightColor0.rgb;
  274. float3 halfDirection = normalize(viewDirection+lightDirection);
  275. ////// Lighting:
  276. float attenuation = LIGHT_ATTENUATION(i);
  277. float3 attenColor = attenuation * _LightColor0.xyz;
  278. float Pi = 3.141592654;
  279. float InvPi = 0.31830988618;
  280. ///////// Gloss:
  281. float gloss = _Roughness;
  282. float perceptualRoughness = 1.0 - _Roughness;
  283. float roughness = perceptualRoughness * perceptualRoughness;
  284. float specPow = exp2( gloss * 10.0 + 1.0 );
  285. ////// Specular:
  286. float NdotL = saturate(dot( normalDirection, lightDirection ));
  287. float LdotH = saturate(dot(lightDirection, halfDirection));
  288. float3 specularColor = _Metallic;
  289. float specularMonochrome;
  290. float3 diffuseColor = lerp(_FrontColor.rgb,_BackColor.rgb,(1.0 - pow(1.0-max(0,dot(normalDirection, viewDirection)),_GradientPower))); // Need this for specular when using metallic
  291. diffuseColor = DiffuseAndSpecularFromMetallic( diffuseColor, specularColor, specularColor, specularMonochrome );
  292. specularMonochrome = 1.0-specularMonochrome;
  293. float NdotV = abs(dot( normalDirection, viewDirection ));
  294. float NdotH = saturate(dot( normalDirection, halfDirection ));
  295. float VdotH = saturate(dot( viewDirection, halfDirection ));
  296. float visTerm = SmithJointGGXVisibilityTerm( NdotL, NdotV, roughness );
  297. float normTerm = GGXTerm(NdotH, roughness);
  298. float specularPBL = (visTerm*normTerm) * UNITY_PI;
  299. #ifdef UNITY_COLORSPACE_GAMMA
  300. specularPBL = sqrt(max(1e-4h, specularPBL));
  301. #endif
  302. specularPBL = max(0, specularPBL * NdotL);
  303. #if defined(_SPECULARHIGHLIGHTS_OFF)
  304. specularPBL = 0.0;
  305. #endif
  306. specularPBL *= any(specularColor) ? 1.0 : 0.0;
  307. float3 directSpecular = attenColor*specularPBL*FresnelTerm(specularColor, LdotH);
  308. float3 specular = directSpecular;
  309. /////// Diffuse:
  310. NdotL = max(0.0,dot( normalDirection, lightDirection ));
  311. half fd90 = 0.5 + 2 * LdotH * LdotH * (1-gloss);
  312. float nlPow5 = Pow5(1-NdotL);
  313. float nvPow5 = Pow5(1-NdotV);
  314. float3 directDiffuse = ((1 +(fd90 - 1)*nlPow5) * (1 + (fd90 - 1)*nvPow5) * NdotL) * attenColor;
  315. float3 diffuse = directDiffuse * diffuseColor;
  316. /// Final Color:
  317. float3 finalColor = diffuse + specular;
  318. fixed4 finalRGBA = fixed4(finalColor * 1,0);
  319. UNITY_APPLY_FOG(i.fogCoord, finalRGBA);
  320. return finalRGBA;
  321. }
  322. ENDCG
  323. }
  324. Pass {
  325. Name "Meta"
  326. Tags {
  327. "LightMode"="Meta"
  328. }
  329. Cull Off
  330.  
  331. CGPROGRAM
  332. #pragma vertex vert
  333. #pragma fragment frag
  334. #define UNITY_PASS_META 1
  335. #define SHOULD_SAMPLE_SH ( defined (LIGHTMAP_OFF) && defined(DYNAMICLIGHTMAP_OFF) )
  336. #define _GLOSSYENV 1
  337. #include "UnityCG.cginc"
  338. #include "Lighting.cginc"
  339. #include "UnityPBSLighting.cginc"
  340. #include "UnityStandardBRDF.cginc"
  341. #include "UnityMetaPass.cginc"
  342. #pragma fragmentoption ARB_precision_hint_fastest
  343. #pragma multi_compile_shadowcaster
  344. #pragma multi_compile LIGHTMAP_OFF LIGHTMAP_ON
  345. #pragma multi_compile DIRLIGHTMAP_OFF DIRLIGHTMAP_COMBINED DIRLIGHTMAP_SEPARATE
  346. #pragma multi_compile DYNAMICLIGHTMAP_OFF DYNAMICLIGHTMAP_ON
  347. #pragma multi_compile_fog
  348. #pragma only_renderers d3d9 d3d11 glcore gles
  349. #pragma target 3.0
  350. uniform float4 _BackColor;
  351. uniform float _FresnelPower;
  352. uniform float4 _FresnelColor;
  353. uniform float _Metallic;
  354. uniform float _Roughness;
  355. uniform float4 _FrontColor;
  356. uniform float _GradientPower;
  357. struct VertexInput {
  358. float4 vertex : POSITION;
  359. float3 normal : NORMAL;
  360. float2 texcoord1 : TEXCOORD1;
  361. float2 texcoord2 : TEXCOORD2;
  362. };
  363. struct VertexOutput {
  364. float4 pos : SV_POSITION;
  365. float2 uv1 : TEXCOORD0;
  366. float2 uv2 : TEXCOORD1;
  367. float4 posWorld : TEXCOORD2;
  368. float3 normalDir : TEXCOORD3;
  369. };
  370. VertexOutput vert (VertexInput v) {
  371. VertexOutput o = (VertexOutput)0;
  372. o.uv1 = v.texcoord1;
  373. o.uv2 = v.texcoord2;
  374. o.normalDir = UnityObjectToWorldNormal(v.normal);
  375. o.posWorld = mul(unity_ObjectToWorld, v.vertex);
  376. o.pos = UnityMetaVertexPosition(v.vertex, v.texcoord1.xy, v.texcoord2.xy, unity_LightmapST, unity_DynamicLightmapST );
  377. return o;
  378. }
  379. float4 frag(VertexOutput i) : SV_Target {
  380. i.normalDir = normalize(i.normalDir);
  381. float3 viewDirection = normalize(_WorldSpaceCameraPos.xyz - i.posWorld.xyz);
  382. float3 normalDirection = i.normalDir;
  383. UnityMetaInput o;
  384. UNITY_INITIALIZE_OUTPUT( UnityMetaInput, o );
  385.  
  386. o.Emission = (_FresnelColor.rgb*pow(1.0-max(0,dot(normalDirection, viewDirection)),_FresnelPower));
  387.  
  388. float3 diffColor = lerp(_FrontColor.rgb,_BackColor.rgb,(1.0 - pow(1.0-max(0,dot(normalDirection, viewDirection)),_GradientPower)));
  389. float specularMonochrome;
  390. float3 specColor;
  391. diffColor = DiffuseAndSpecularFromMetallic( diffColor, _Metallic, specColor, specularMonochrome );
  392. float roughness = 1.0 - _Roughness;
  393. o.Albedo = diffColor + specColor * roughness * roughness * 0.5;
  394.  
  395. return UnityMetaFragment( o );
  396. }
  397. ENDCG
  398. }
  399. }
  400. FallBack "Diffuse"
  401. CustomEditor "ShaderForgeMaterialInspector"
  402. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement