Preview_IndirectSpecularLight.shader 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. Shader "Hidden/IndirectSpecularLight"
  2. {
  3. Properties
  4. {
  5. _Skybox("_Skybox", CUBE) = "white" {}
  6. _A ("Normal", 2D) = "white" {}
  7. _B ("Smoothness", 2D) = "white" {}
  8. _C ("Occlusion", 2D) = "white" {}
  9. }
  10. SubShader
  11. {
  12. Pass // not connected
  13. {
  14. CGPROGRAM
  15. #pragma vertex vert_img
  16. #pragma fragment frag
  17. #include "UnityCG.cginc"
  18. #include "Preview.cginc"
  19. #include "Lighting.cginc"
  20. #include "UnityPBSLighting.cginc"
  21. uniform samplerCUBE _Skybox;
  22. sampler2D _A;
  23. sampler2D _B;
  24. sampler2D _C;
  25. float4 frag(v2f_img i) : SV_Target
  26. {
  27. float3 vertexPos = PreviewFragmentPositionOS( i.uv );
  28. float3 normal = PreviewFragmentNormalOS( i.uv );
  29. float3 worldNormal = UnityObjectToWorldNormal( normal );
  30. float3 worldViewDir = normalize( preview_WorldSpaceCameraPos - vertexPos );
  31. float3 worldRefl = normalize( reflect( -worldViewDir, worldNormal ) );
  32. float3 sky = texCUBElod( _Skybox, float4( worldRefl, ( 1 - saturate( tex2D( _B, i.uv ).r ) ) * 6 ) ).rgb;
  33. return float4( sky * tex2D( _C, i.uv ).r, 1 );
  34. }
  35. ENDCG
  36. }
  37. Pass // connected tangent
  38. {
  39. CGPROGRAM
  40. #pragma vertex vert_img
  41. #pragma fragment frag
  42. #include "UnityCG.cginc"
  43. #include "Preview.cginc"
  44. #include "Lighting.cginc"
  45. #include "UnityPBSLighting.cginc"
  46. uniform samplerCUBE _Skybox;
  47. sampler2D _A;
  48. sampler2D _B;
  49. sampler2D _C;
  50. float4 frag(v2f_img i) : SV_Target
  51. {
  52. float3 vertexPos = PreviewFragmentPositionOS( i.uv );
  53. float3 normal = PreviewFragmentNormalOS( i.uv );
  54. float3 tangentNormal = tex2D( _A, PreviewFragmentSphericalUV( i.uv ) ).xyz;
  55. float3 worldNormal = PreviewFragmentTangentToWorldDir( i.uv, tangentNormal, true );
  56. float3 worldViewDir = normalize( preview_WorldSpaceCameraPos - vertexPos );
  57. float3 worldRefl = reflect( -worldViewDir, worldNormal );
  58. float3 sky = texCUBElod( _Skybox, float4( worldRefl, ( 1 - saturate( tex2D( _B, i.uv ).r ) ) * 6 ) ).rgb;
  59. return float4( sky * tex2D( _C, i.uv ).r, 1 );
  60. }
  61. ENDCG
  62. }
  63. Pass // connected world
  64. {
  65. CGPROGRAM
  66. #pragma vertex vert_img
  67. #pragma fragment frag
  68. #include "UnityCG.cginc"
  69. #include "Preview.cginc"
  70. #include "Lighting.cginc"
  71. #include "UnityPBSLighting.cginc"
  72. uniform samplerCUBE _Skybox;
  73. sampler2D _A;
  74. sampler2D _B;
  75. sampler2D _C;
  76. float4 frag(v2f_img i) : SV_Target
  77. {
  78. float3 vertexPos = PreviewFragmentPositionOS( i.uv );
  79. float3 normal = PreviewFragmentNormalOS( i.uv );
  80. float3 worldNormal = tex2D( _A, i.uv );
  81. float3 worldViewDir = normalize( preview_WorldSpaceCameraPos - vertexPos );
  82. float3 worldRefl = reflect( -worldViewDir, worldNormal );
  83. float3 sky = texCUBElod( _Skybox, float4( worldRefl, ( 1 - saturate( tex2D( _B, i.uv ).r ) ) * 6 ) ).rgb;
  84. return float4( sky * tex2D( _C, i.uv ).r, 1 );
  85. }
  86. ENDCG
  87. }
  88. }
  89. }