New_Skin.shader 40 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979
  1. // Shader uses custom editor to set double sided GI
  2. // Needs _Culling to be set properly
  3. Shader "New_skin"
  4. {
  5. Properties
  6. {
  7. [HeaderHelpLuxURP_URL(snoamqpqhtdl)]
  8. [ToggleOff]_Receive_Shadows ("Receive Shadows", Float) = 1.0
  9. _BaseColor ("Color", Color) = (1,1,1,1)
  10. _BaseMap ("BaseTex", 2D) = "white" { }
  11. _ClothMask1("Cloth Mask1", 2D) = "white" {}
  12. _ClothMask2("Cloth Mask2", 2D) = "white" {}
  13. _ClothMask3("Cloth Mask3", 2D) = "white" {}
  14. _BumpMap ("NormalMap", 2D) = "bump" { }
  15. _MetalSmoothTex ("R粗糙度,G金属度,B=AO", 2D) = "white" { }
  16. _SSSMap ("R=SSS,G=自发光,B=透明", 2D) = "black" { }
  17. _BloomTex ("Bloom MaskTex", 2D) = "black" { }
  18. [Header(Rough Metal Control)] _Metalness ("金属度", Range(0, 1)) = 1
  19. _Roughness ("粗糙度", Range(0, 1)) = 1
  20. [Header(Light Control)] _DirLightColor ("平行光颜色", Color) = (1,1,1,0)
  21. _DirLightExposure ("平行光亮度", Range(0, 10)) = 0.8
  22. _EnvExposure ("环境光强度", Range(0, 10)) = 0.96
  23. _SHExposure ("SH亮度", Range(0, 10)) = 0.53
  24. [Header(SSS Control)] _SkinSSSfresnelMask ("皮肤菲尼尔", Range(0, 1)) = 0.128
  25. _SkinSSSTransmission ("SSS强度", Range(0, 1)) = 0.866
  26. _SkinSSSScatterColor ("SSS颜色", Color) = (1.0,0.3161765,0.3161765,0)
  27. [Header(Shadow Control)] _ShadowDarkness ("阴影深浅", Range(0, 1)) = 0
  28. _ShadowCol ("阴影颜色", Color) = (0,0,0,0)
  29. _EmissionCol ("自发光颜色", Color) = (0.448,0.591,0.662,0)
  30. _EmissionExposure ("自发光亮度", Float) = 1
  31. [Header(Advanced Control (Ask TA About This))]
  32. _PunctualLightSpecularExposure ("高光亮度", Range(0, 10)) = 1
  33. _PointLightExposure("点光亮度", Range(0, 10)) = 1
  34. _CosMin("暗部曝光", Range(0.01, 0.95)) = 0.01
  35. _envBDRFFactor("高光色泽度", Range(-1, 1)) = 0.58
  36. [Header(PostProcessing Control)] _BloomIntensity ("Bloom 强度", Float) = 1
  37. _DarkCornerColor("DarkCornerColor", Vector) = (0,0,0,0)
  38. [Header(Mask)]
  39. [Space(8)]
  40. _MakeUpMask1_RGB("MakeUpMask1_RGB (R: 眼影 G: 腮红 B: 口红 A: 眼线)", 2D) = "black" {}
  41. _MakeUpMask2_RGB("MakeUpMask2_RGB (R: 纹身区域)", 2D) = "black" {}
  42. _Mask1_Rchannel_TextureAmountA("Mask1_Rchannel_Texture-Amount(A)", 2D) = "black" {}
  43. _Mask1_Gchannel_TextureAmountA("Mask1_Gchannel_Texture-Amount(A)", 2D) = "black" {}
  44. _Mask1_Bchannel_TextureAmountA("Mask1_Bchannel_Texture-Amount(A)", 2D) = "black" {}
  45. _Mask1_Achannel_TextureAmountA("Mask1_Achannel_Texture-Amount(A)", 2D) = "black" {}
  46. _Mask2_Rchannel_TextureAmountA("Mask2_Rchannel_Texture-Amount(A)", 2D) = "black" {}
  47. //_Mask2_Gchannel_TextureAmountA("Mask2_Gchannel_Texture-Amount(A)", 2D) = "black" {}
  48. //_Mask2_Bchannel_TextureAmountA("Mask2_Bchannel_Texture-Amount(A)", 2D) = "black" {}
  49. _Mask1_Rchannel_ColorAmountA("Mask1_Rchannel_Color-Amount(A)", Color) = (0.7735849, 0.2006942, 0.3233189, 0.7843137)
  50. _Mask1_Gchannel_ColorAmountA("Mask1_Gchannel_Color-Amount(A)", Color) = (0.2, 0.772549, 0.4917381, 0.7843137)
  51. _Mask1_Bchannel_ColorAmountA("Mask1_Bchannel_Color-Amount(A)", Color) = (0.2, 0.406334, 0.772549, 0.7843137)
  52. _Mask1_Achannel_ColorAmountA("Mask1_Achannel_Color-Amount(A)", Color) = (0.2, 0.406334, 0.772549, 0.7843137)
  53. _Mask2_Rchannel_ColorAmountA("Mask2_Rchannel_Color-Amount(A)", Color) = (0.2, 0.772549, 0.7071339, 0.7843137)
  54. //_Mask2_Gchannel_ColorAmountA("Mask2_Gchannel_Color-Amount(A)", Color) = (0.772549, 0.2, 0.6776864, 0.7843137)
  55. //_Mask2_Bchannel_ColorAmountA("Mask2_Bchannel_Color-Amount(A)", Color) = (0.772549, 0.7037676, 0.2, 0.7843137)
  56. // Needed by the inspector
  57. [HideInInspector] _Culling("Culling", Float) = 0.0
  58. // Lightmapper and outline selection shader need _MainTex, _Color and _Cutoff
  59. [HideInInspector] _MainTex("Albedo", 2D) = "white" {}
  60. [HideInInspector] _Color("Color", Color) = (1,1,1,1)
  61. [HideInInspector] _Cutoff("Alpha Cutoff", Range(0.0, 1.0)) = 0.0
  62. // URP 10.1. needs this for the depthnormal pass
  63. [HideInInspector] _Cutoff(" Threshold", Range(0.0, 1.0)) = 0.5
  64. [HideInInspector] _Surface("__surface", Float) = 0.0
  65. }
  66. Category{
  67. CGINCLUDE
  68. // Upgrade NOTE: excluded shader from OpenGL ES 2.0 because it uses non-square matrices
  69. #pragma exclude_renderers gles
  70. #include "UnityCG.cginc"
  71. #include "UnityPBSLighting.cginc"
  72. #include "AutoLight.cginc"
  73. sampler2D _BaseMap, _BumpMap, _MetalSmoothTex, _EmissiveTex;
  74. float4 _DirLightColor, _SkinSSSScatterColor, _MainTex_ST,_BaseMap_ST;
  75. float3 _EmissionCol, _ShadowCol;
  76. half4 _BaseColor;
  77. float _Metalness, _Roughness, _DirLightExposure, _EnvExposure, _SHExposure, _SkinSSSfresnelMask, _SkinSSSTransmission, _ShadowDarkness, _EmissionExposure, _PointLightExposure, _PunctualLightSpecularExposure, _CosMin;
  78. fixed _envBDRFFactor;
  79. uniform sampler2D _EnvironmentTex, _SGameShadowTexture;
  80. uniform float4x4 _SGameShadowMatrix, _SGameMV, _envSHR, _envSHG, _envSHB, _envRot;
  81. //uniform float4 _SGameShadowParams, _PointLightPosAndRange, _PointLightColorAndAtten;
  82. uniform float _Global_BloomThreshold;
  83. uniform half4 _HeroShowOverallExposureColor;
  84. uniform half3 _DarkCornerColor;
  85. uniform half _BloomIntensity;
  86. sampler2D _MakeUpMask1_RGB;
  87. sampler2D _MakeUpMask2_RGB;
  88. sampler2D _Mask1_Rchannel_TextureAmountA;
  89. sampler2D _Mask1_Gchannel_TextureAmountA;
  90. sampler2D _Mask1_Bchannel_TextureAmountA;
  91. sampler2D _Mask1_Achannel_TextureAmountA;
  92. sampler2D _Mask2_Rchannel_TextureAmountA;
  93. //sampler2D _Mask2_Gchannel_TextureAmountA;
  94. //sampler2D _Mask2_Bchannel_TextureAmountA;
  95. // Mask
  96. float4 _MakeUpMask1_RGB_ST;
  97. float4 _MakeUpMask2_RGB_ST;
  98. float4 _Mask1_Rchannel_ColorAmountA;
  99. float4 _Mask1_Gchannel_ColorAmountA;
  100. float4 _Mask1_Bchannel_ColorAmountA;
  101. float4 _Mask1_Achannel_ColorAmountA;
  102. float4 _Mask2_Rchannel_ColorAmountA;
  103. //float4 _Mask2_Gchannel_ColorAmountA;
  104. //float4 _Mask2_Bchannel_ColorAmountA;
  105. float4 _Mask1_Rchannel_TextureAmountA_ST;
  106. float4 _Mask1_Gchannel_TextureAmountA_ST;
  107. float4 _Mask1_Bchannel_TextureAmountA_ST;
  108. float4 _Mask1_Achannel_TextureAmountA_ST;
  109. float4 _Mask2_Rchannel_TextureAmountA_ST;
  110. //float4 _Mask2_Gchannel_TextureAmountA_ST;
  111. //float4 _Mask2_Bchannel_TextureAmountA_ST;
  112. sampler2D _ClothMask1;
  113. sampler2D _ClothMask2;
  114. sampler2D _ClothMask3;
  115. struct v2f
  116. {
  117. float4 pos : SV_POSITION;
  118. float4 uv : TEXCOORD0;
  119. float4 worldPos : TEXCOORD1;
  120. half4 wNormal : TEXCOORD2;
  121. half4 wTangent : TEXCOORD3;
  122. //half4 shadowPos : TEXCOORD4;
  123. //float4 viewPos : TEXCOORD5;
  124. UNITY_LIGHTING_COORDS(4,5)
  125. //UNITY_FOG_COORDS(8)
  126. };
  127. half4 AddMaskColor(half3 baseColor, float2 uv) {
  128. half4 albedoAlpha = half4(baseColor,1);
  129. float2 uv_MakeUpMask1_RGB = uv.xy * _MakeUpMask1_RGB_ST.xy + _MakeUpMask1_RGB_ST.zw;
  130. float4 tex2DNode143 = tex2D(_MakeUpMask1_RGB, uv_MakeUpMask1_RGB);
  131. float2 uv_Mask1_Rchannel_TextureAmountA = uv.xy * _Mask1_Rchannel_TextureAmountA_ST.xy + _Mask1_Rchannel_TextureAmountA_ST.zw;
  132. float4 tex2D_mask1_R = tex2D(_Mask1_Rchannel_TextureAmountA, uv_Mask1_Rchannel_TextureAmountA);
  133. float2 uv_Mask1_Gchannel_TextureAmountA = uv.xy * _Mask1_Gchannel_TextureAmountA_ST.xy + _Mask1_Gchannel_TextureAmountA_ST.zw;
  134. float4 tex2D_mask1_G = tex2D(_Mask1_Gchannel_TextureAmountA, uv_Mask1_Gchannel_TextureAmountA);
  135. float2 uv_Mask1_Bchannel_TextureAmountA = uv.xy * _Mask1_Bchannel_TextureAmountA_ST.xy + _Mask1_Bchannel_TextureAmountA_ST.zw;
  136. float4 tex2D_mask1_B = tex2D(_Mask1_Bchannel_TextureAmountA, uv_Mask1_Bchannel_TextureAmountA);
  137. float2 uv_Mask1_Achannel_TextureAmountA = uv.xy * _Mask1_Achannel_TextureAmountA_ST.xy + _Mask1_Achannel_TextureAmountA_ST.zw;
  138. float4 tex2D_mask1_A = tex2D(_Mask1_Achannel_TextureAmountA, uv_Mask1_Achannel_TextureAmountA);
  139. float2 uv_Mask2_Rchannel_TextureAmountA = uv.xy * _Mask2_Rchannel_TextureAmountA_ST.xy + _Mask2_Rchannel_TextureAmountA_ST.zw;
  140. float4 tex2D_mask2_R = tex2D(_Mask2_Rchannel_TextureAmountA, uv_Mask2_Rchannel_TextureAmountA);
  141. //float2 uv_Mask2_Gchannel_TextureAmountA = uv.xy * _Mask2_Gchannel_TextureAmountA_ST.xy + _Mask2_Gchannel_TextureAmountA_ST.zw;
  142. //float4 tex2D_mask2_G = tex2D(_Mask2_Gchannel_TextureAmountA, uv_Mask2_Gchannel_TextureAmountA);
  143. //float2 uv_Mask2_Bchannel_TextureAmountA = uv.xy * _Mask2_Bchannel_TextureAmountA_ST.xy + _Mask2_Bchannel_TextureAmountA_ST.zw;
  144. //float4 tex2D_mask2_B = tex2D(_Mask2_Bchannel_TextureAmountA, uv_Mask2_Bchannel_TextureAmountA);
  145. float clampResult295 = clamp((tex2DNode143.r * tex2D_mask1_R.a * _Mask1_Rchannel_ColorAmountA.a), 0.0, 1.0);
  146. float4 _Mask1_R_Color = tex2D_mask1_R * _Mask1_Rchannel_ColorAmountA;
  147. float4 lerpResult145 = lerp(albedoAlpha, _Mask1_R_Color, clampResult295);
  148. float clampResult296 = clamp((tex2DNode143.g * tex2D_mask1_G.a * _Mask1_Gchannel_ColorAmountA.a), 0.0, 1.0);
  149. float4 _Mask1_G_Color = tex2D_mask1_G * _Mask1_Gchannel_ColorAmountA;
  150. float4 lerpResult160 = lerp(lerpResult145, _Mask1_G_Color, clampResult296);
  151. float clampResult297 = clamp((tex2DNode143.b * tex2D_mask1_B.a * _Mask1_Bchannel_ColorAmountA.a), 0.0, 1.0);
  152. float4 _Mask1_B_Color = tex2D_mask1_B * _Mask1_Bchannel_ColorAmountA;
  153. float4 lerpResult161 = lerp(lerpResult160, _Mask1_B_Color, clampResult297);
  154. float clampResult2971 = clamp((tex2DNode143.a * tex2D_mask1_A.a * _Mask1_Achannel_ColorAmountA.a), 0.0, 1.0);
  155. float4 _Mask1_A_Color = tex2D_mask1_A * _Mask1_Achannel_ColorAmountA;
  156. float4 lerpResult1611 = lerp(lerpResult161, _Mask1_A_Color, clampResult2971);
  157. //mask2
  158. float2 uv_MakeUpMask2_RGB = uv.xy * _MakeUpMask2_RGB_ST.xy + _MakeUpMask2_RGB_ST.zw;
  159. float4 tex2DNode144 = tex2D(_MakeUpMask2_RGB, uv_MakeUpMask2_RGB);
  160. float clampResult298 = clamp((tex2DNode144.r * tex2D_mask2_R.a * _Mask2_Rchannel_ColorAmountA.a), 0.0, 1.0);
  161. float4 _Mask2_R_Color = tex2D_mask2_R * _Mask2_Rchannel_ColorAmountA;
  162. float4 lerpResult162 = lerp(lerpResult1611, _Mask2_Rchannel_ColorAmountA, clampResult298);
  163. //float clampResult299 = clamp((tex2DNode144.g * tex2D_mask2_G.a * _Mask2_Gchannel_ColorAmountA.a), 0.0, 1.0);
  164. //float4 _Mask2_G_Color = tex2D_mask2_G * _Mask2_Gchannel_ColorAmountA;
  165. //float4 lerpResult163 = lerp(lerpResult162, _Mask2_Gchannel_ColorAmountA, clampResult299);
  166. //float clampResult300 = clamp((tex2DNode144.b * tex2D_mask2_B.a * _Mask2_Bchannel_ColorAmountA.a), 0.0, 1.0);
  167. //float4 _Mask2_B_Color = tex2D_mask2_B * _Mask2_Bchannel_ColorAmountA;
  168. //float4 lerpResult164 = lerp(lerpResult163, _Mask2_Bchannel_ColorAmountA, clampResult300);
  169. albedoAlpha.rgb = half3(lerpResult162.r, lerpResult162.g, lerpResult162.b);
  170. return albedoAlpha;
  171. }
  172. half4 GetColor(float2 uv) {
  173. //half4 albedoAlpha = SAMPLE_TEXTURE2D(_BaseMap, sampler_BaseMap, uv) * _BaseColor;
  174. half4 albedoAlpha = tex2D(_BaseMap, uv) * _BaseColor;
  175. float2 uv_MakeUpMask1_RGB = uv.xy * _MakeUpMask1_RGB_ST.xy + _MakeUpMask1_RGB_ST.zw;
  176. //float4 tex2DNode143 = SAMPLE_TEXTURE2D(_MakeUpMask1_RGB, sampler_MakeUpMask1_RGB, uv_MakeUpMask1_RGB);
  177. float4 tex2DNode143 = tex2D(_MakeUpMask1_RGB, uv_MakeUpMask1_RGB);
  178. float2 uv_Mask1_Rchannel_TextureAmountA = uv.xy * _Mask1_Rchannel_TextureAmountA_ST.xy + _Mask1_Rchannel_TextureAmountA_ST.zw;
  179. //float4 tex2D_mask1_R = SAMPLE_TEXTURE2D(_Mask1_Rchannel_TextureAmountA, sampler_Mask1_Rchannel_TextureAmountA, uv_Mask1_Rchannel_TextureAmountA);
  180. float4 tex2D_mask1_R = tex2D(_Mask1_Rchannel_TextureAmountA, uv_Mask1_Rchannel_TextureAmountA);
  181. float2 uv_Mask1_Gchannel_TextureAmountA = uv.xy * _Mask1_Gchannel_TextureAmountA_ST.xy + _Mask1_Gchannel_TextureAmountA_ST.zw;
  182. //float4 tex2D_mask1_G = SAMPLE_TEXTURE2D(_Mask1_Gchannel_TextureAmountA, sampler_Mask1_Gchannel_TextureAmountA, uv_Mask1_Gchannel_TextureAmountA);
  183. float4 tex2D_mask1_G = tex2D(_Mask1_Gchannel_TextureAmountA, uv_Mask1_Gchannel_TextureAmountA);
  184. float2 uv_Mask1_Bchannel_TextureAmountA = uv.xy * _Mask1_Bchannel_TextureAmountA_ST.xy + _Mask1_Bchannel_TextureAmountA_ST.zw;
  185. //float4 tex2D_mask1_B = SAMPLE_TEXTURE2D(_Mask1_Bchannel_TextureAmountA, sampler_Mask1_Bchannel_TextureAmountA, uv_Mask1_Bchannel_TextureAmountA);
  186. float4 tex2D_mask1_B = tex2D(_Mask1_Bchannel_TextureAmountA, uv_Mask1_Bchannel_TextureAmountA);
  187. float2 uv_Mask1_Achannel_TextureAmountA = uv.xy * _Mask1_Achannel_TextureAmountA_ST.xy + _Mask1_Achannel_TextureAmountA_ST.zw;
  188. //float4 tex2D_mask1_A = SAMPLE_TEXTURE2D(_Mask1_Achannel_TextureAmountA, sampler_Mask1_Achannel_TextureAmountA, uv_Mask1_Achannel_TextureAmountA);
  189. float4 tex2D_mask1_A = tex2D(_Mask1_Achannel_TextureAmountA, uv_Mask1_Achannel_TextureAmountA);
  190. float2 uv_Mask2_Rchannel_TextureAmountA = uv.xy * _Mask2_Rchannel_TextureAmountA_ST.xy + _Mask2_Rchannel_TextureAmountA_ST.zw;
  191. //float4 tex2D_mask2_R = SAMPLE_TEXTURE2D(_Mask2_Rchannel_TextureAmountA, sampler_Mask2_Rchannel_TextureAmountA, uv_Mask2_Rchannel_TextureAmountA);
  192. float4 tex2D_mask2_R = tex2D(_Mask2_Rchannel_TextureAmountA, uv_Mask2_Rchannel_TextureAmountA);
  193. //float2 uv_Mask2_Gchannel_TextureAmountA = uv.xy * _Mask2_Gchannel_TextureAmountA_ST.xy + _Mask2_Gchannel_TextureAmountA_ST.zw;
  194. //float4 tex2D_mask2_G = SAMPLE_TEXTURE2D(_Mask2_Gchannel_TextureAmountA, sampler_Mask2_Gchannel_TextureAmountA, uv_Mask2_Gchannel_TextureAmountA);
  195. //float4 tex2D_mask2_G = tex2D(_Mask2_Gchannel_TextureAmountA, uv_Mask2_Gchannel_TextureAmountA);
  196. //float2 uv_Mask2_Bchannel_TextureAmountA = uv.xy * _Mask2_Bchannel_TextureAmountA_ST.xy + _Mask2_Bchannel_TextureAmountA_ST.zw;
  197. //float4 tex2D_mask2_B = SAMPLE_TEXTURE2D(_Mask2_Bchannel_TextureAmountA, sampler_Mask2_Bchannel_TextureAmountA, uv_Mask2_Bchannel_TextureAmountA);
  198. //float4 tex2D_mask2_B = tex2D(_Mask2_Bchannel_TextureAmountA, uv_Mask2_Bchannel_TextureAmountA);
  199. float clampResult295 = clamp((tex2DNode143.r * tex2D_mask1_R.a * _Mask1_Rchannel_ColorAmountA.a), 0.0, 1.0);
  200. float4 _Mask1_R_Color = tex2D_mask1_R * _Mask1_Rchannel_ColorAmountA;
  201. float4 lerpResult145 = lerp(albedoAlpha, _Mask1_R_Color, clampResult295);
  202. float clampResult296 = clamp((tex2DNode143.g * tex2D_mask1_G.a * _Mask1_Gchannel_ColorAmountA.a), 0.0, 1.0);
  203. float4 _Mask1_G_Color = tex2D_mask1_G * _Mask1_Gchannel_ColorAmountA;
  204. float4 lerpResult160 = lerp(lerpResult145, _Mask1_G_Color, clampResult296);
  205. float clampResult297 = clamp((tex2DNode143.b * tex2D_mask1_B.a * _Mask1_Bchannel_ColorAmountA.a), 0.0, 1.0);
  206. float4 _Mask1_B_Color = tex2D_mask1_B * _Mask1_Bchannel_ColorAmountA;
  207. float4 lerpResult161 = lerp(lerpResult160, _Mask1_B_Color, clampResult297);
  208. float clampResult2971 = clamp((tex2DNode143.a * tex2D_mask1_A.a * _Mask1_Achannel_ColorAmountA.a), 0.0, 1.0);
  209. float4 _Mask1_A_Color = tex2D_mask1_A * _Mask1_Achannel_ColorAmountA;
  210. float4 lerpResult1611 = lerp(lerpResult161, _Mask1_A_Color, clampResult2971);
  211. //mask2
  212. float2 uv_MakeUpMask2_RGB = uv.xy * _MakeUpMask2_RGB_ST.xy + _MakeUpMask2_RGB_ST.zw;
  213. //float4 tex2DNode144 = SAMPLE_TEXTURE2D(_MakeUpMask2_RGB, sampler_MakeUpMask2_RGB, uv_MakeUpMask2_RGB);
  214. float4 tex2DNode144 = tex2D(_MakeUpMask2_RGB, uv_MakeUpMask2_RGB);
  215. float clampResult298 = clamp((tex2DNode144.r * tex2D_mask2_R.a * _Mask2_Rchannel_ColorAmountA.a), 0.0, 1.0);
  216. float4 _Mask2_R_Color = tex2D_mask2_R * _Mask2_Rchannel_ColorAmountA;
  217. float4 lerpResult162 = lerp(lerpResult1611, _Mask2_Rchannel_ColorAmountA, clampResult298);
  218. //float clampResult299 = clamp((tex2DNode144.g * tex2D_mask2_G.a * _Mask2_Gchannel_ColorAmountA.a), 0.0, 1.0);
  219. //float4 _Mask2_G_Color = tex2D_mask2_G * _Mask2_Gchannel_ColorAmountA;
  220. //float4 lerpResult163 = lerp(lerpResult162, _Mask2_Gchannel_ColorAmountA, clampResult299);
  221. //float clampResult300 = clamp((tex2DNode144.b * tex2D_mask2_B.a * _Mask2_Bchannel_ColorAmountA.a), 0.0, 1.0);
  222. //float4 _Mask2_B_Color = tex2D_mask2_B * _Mask2_Bchannel_ColorAmountA;
  223. //float4 lerpResult164 = lerp(lerpResult163, _Mask2_Bchannel_ColorAmountA, clampResult300);
  224. albedoAlpha.rgb = half3(lerpResult162.r, lerpResult162.g, lerpResult162.b);
  225. return albedoAlpha;
  226. }
  227. fixed3 GetAlbedo (v2f i) {
  228. fixed3 albedo = tex2D(_BaseMap, i.uv.xy * _BaseMap_ST.xy + _BaseMap_ST.zw).rgb * _BaseColor.rgb;
  229. //fixed3 albedo = GetColor(i.uv.xy).rgb;
  230. return albedo;
  231. }
  232. float3 GetMetalSmooth (v2f i){
  233. float3 metalSmooth = tex2D(_MetalSmoothTex, i.uv.xy).rgb;
  234. metalSmooth.g *= _Metalness;
  235. metalSmooth.r *= _Roughness;
  236. return metalSmooth;
  237. }
  238. float3 GetEmission (v2f i) {
  239. return tex2D(_EmissiveTex, i.uv.xy).rgb;
  240. }
  241. float3 GetTangentSpaceNormal (v2f i){
  242. float3 normal = float3(0, 0, 1);
  243. normal = UnpackScaleNormal(tex2D(_BumpMap, i.uv.xy), 1.0);
  244. return normal;
  245. }
  246. float3 CreateBinormal (float3 normal, float3 tangent, float binormalSign){
  247. return cross(normal, tangent.xyz) * (binormalSign * unity_WorldTransformParams.w);
  248. }
  249. void InitializeFragmentNormal(inout v2f i){
  250. float3 tangentSpaceNormal = GetTangentSpaceNormal(i);
  251. float3 binormal = CreateBinormal(i.wNormal.xyz, i.wTangent.xyz, i.wTangent.w);
  252. i.wNormal.xyz = normalize(tangentSpaceNormal.x * i.wTangent + tangentSpaceNormal.y * binormal + tangentSpaceNormal.z * i.wNormal.xyz);
  253. }
  254. float D(float NdotH, float roughness){
  255. //float a2 = roughness * roughness + 0.0040000002;
  256. float a2 = max(roughness * roughness, 0.002);
  257. float a4 = a2 * a2;
  258. float d = (NdotH * a4 - NdotH) * NdotH + 1.0f;
  259. return a4 / (d * d);
  260. }
  261. float G(float NdotL, float NdotV, float roughness){
  262. //float a2 = roughness * roughness;
  263. //float a4 = a2 * a2;
  264. //float k = (a4 + 1.0f) * (a4 + 1.0f) /8.0;
  265. float a2 = roughness * 0.5 + 0.5;
  266. float k = a2 * a2;
  267. float g = 0.25 / ((NdotL * (1.0 - k) + k) * (NdotV * (1.0 - k) + k));
  268. return g;
  269. }
  270. float3 F(float VdotH, float3 specColor){
  271. return (clamp ((50.0 * specColor.y), 0.0, 1.0) - specColor) * exp2((((-5.5547299 * VdotH) + (- 6.98316)) * VdotH)) + specColor;
  272. }
  273. inline float3 Shade4PointLightsSpecCol(float4 worldPos, half3 normal, float3 viewDir, float roughness, float skinMask, float NDotV, float3 specColor, out float3 sh){
  274. // to light vectors
  275. float4 toLightX = unity_4LightPosX0 - worldPos.x;
  276. float4 toLightY = unity_4LightPosY0 - worldPos.y;
  277. float4 toLightZ = unity_4LightPosZ0 - worldPos.z;
  278. // squared lengths
  279. float4 lengthSq = 0;
  280. lengthSq += toLightX * toLightX;
  281. lengthSq += toLightY * toLightY;
  282. lengthSq += toLightZ * toLightZ;
  283. // don't produce NaNs if some vertex position overlaps with the light
  284. lengthSq = max(lengthSq, 0.000001);
  285. // NdotL
  286. float4 ndotl = 0;
  287. ndotl += toLightX * normal.x;
  288. ndotl += toLightY * normal.y;
  289. ndotl += toLightZ * normal.z;
  290. // correct NdotL
  291. float4 corr = rsqrt(lengthSq);
  292. ndotl = max (float4(0,0,0,0), ndotl * corr);
  293. // attenuation
  294. float4 atten = 1.0 / (1.0 + lengthSq * unity_4LightAtten0);
  295. //float4 diff = ndotl * atten;
  296. // halfVec
  297. float4 halfX = unity_4LightPosX0 + viewDir.x;
  298. float4 halfY = unity_4LightPosY0 + viewDir.y;
  299. float4 halfZ = unity_4LightPosZ0 + viewDir.z;
  300. float4 lengthHalfSq = 0;
  301. lengthHalfSq += halfX * halfX;
  302. lengthHalfSq += halfY * halfY;
  303. lengthHalfSq += halfZ * halfZ;
  304. lengthHalfSq = max(lengthHalfSq, 0.000001);
  305. float4 ndoth = 0;
  306. ndoth += halfX * normal.x;
  307. ndoth += halfY * normal.y;
  308. ndoth += halfZ * normal.z;
  309. float4 corrHalf = rsqrt(lengthHalfSq);
  310. ndoth = max (float4(0,0,0,0), ndoth * corrHalf);
  311. float4 vdoth = 0;
  312. vdoth += halfX * viewDir.x;
  313. vdoth += halfY * viewDir.y;
  314. vdoth += halfZ * viewDir.z;
  315. vdoth = max (float4(0,0,0,0), vdoth * corrHalf);
  316. //d
  317. float a2 = max ((roughness * roughness), 0.002);
  318. float a4 = (a2 * a2);
  319. float4 d = ((ndoth * a4 - ndoth) * ndoth) + 1.0;
  320. d = a4 / (d * d);
  321. //g
  322. float b2 = 0.5 + (0.5 * roughness);
  323. float k = (b2 * b2);
  324. float4 g = 0.25 / ((ndotl * (1.0 - k) + k) * (NDotV * (1.0 - k) + k));
  325. //f
  326. float4 f = exp2((((-5.5547299 * vdoth) + (- 6.98316)) * vdoth));
  327. half3 oneMinusSpecColor = clamp ((50.0 * specColor.y), 0.0, 1.0) - specColor;
  328. //compute
  329. float4 a = d * g * f * ndotl;
  330. float4 b = d * g * ndotl;
  331. half3 col[4];
  332. col[0] = unity_LightColor[0].rgb * atten.x;
  333. col[1] = unity_LightColor[1].rgb * atten.y;
  334. col[2] = unity_LightColor[2].rgb * atten.z;
  335. col[3] = unity_LightColor[3].rgb * atten.w;
  336. float3x4 colorAtten = {col[0].x, col[1].x, col[2].x, col[3].x, col[0].y, col[1].y, col[2].y, col[3].y, col[0].z, col[1].z, col[2].z, col[3].z};
  337. float3 scatterColor = (_SkinSSSScatterColor * skinMask).xyz;
  338. sh = (mul(colorAtten, ndotl) + (col[0] + col[1] + col[2] + col[3]) * scatterColor) / (scatterColor + 1.0) * _PointLightExposure;
  339. return mul(colorAtten, a) * oneMinusSpecColor + mul(colorAtten, b) * specColor;
  340. }
  341. half3 SH(half3 normal, inout float3 refDir){
  342. (_envRot[0].x = 1.0);
  343. (_envRot[0].y = 0.0);
  344. (_envRot[0].z = 0.0);
  345. (_envRot[0].w = 0.0);
  346. (_envRot[1].x = 0.0);
  347. (_envRot[1].y = 1.0);
  348. (_envRot[1].z = 0.0);
  349. (_envRot[1].w = 0.0);
  350. (_envRot[2].x = 0.0);
  351. (_envRot[2].y = 0.0);
  352. (_envRot[2].z = 1.0);
  353. (_envRot[2].w = 0.0);
  354. (_envRot[3].x = 0.0);
  355. (_envRot[3].y = 0.0);
  356. (_envRot[3].z = 0.0);
  357. (_envRot[3].w = 1.0);
  358. refDir = mul(_envRot , refDir).xyz;
  359. float4 tmpvar_41 = mul(_envRot , half4(normal, 1.0));
  360. //_envSHR = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
  361. (_envSHR[0].x = 0.046);
  362. (_envSHR[0].y = 0.0);
  363. (_envSHR[0].z = 0.0);
  364. (_envSHR[0].w = 0.0);
  365. (_envSHR[1].x = 0.036);
  366. (_envSHR[1].y = -0.046);
  367. (_envSHR[1].z = 0.0);
  368. (_envSHR[1].w = 0.0);
  369. (_envSHR[2].x = -0.021);
  370. (_envSHR[2].y = -0.049);
  371. (_envSHR[2].z = 0.02);
  372. (_envSHR[2].w = 0.0);
  373. (_envSHR[3].x = 0.109);
  374. (_envSHR[3].y = 0.131);
  375. (_envSHR[3].z = -0.09);
  376. (_envSHR[3].w = 0.569);
  377. //_envSHG = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
  378. (_envSHG[0].x = 0.043);
  379. (_envSHG[0].y = 0.0);
  380. (_envSHG[0].z = 0.0);
  381. (_envSHG[0].w = 0.0);
  382. (_envSHG[1].x = 0.066);
  383. (_envSHG[1].y = -0.043);
  384. (_envSHG[1].z = 0.0);
  385. (_envSHG[1].w = 0.0);
  386. (_envSHG[2].x = -0.03);
  387. (_envSHG[2].y = -0.072);
  388. (_envSHG[2].z = 0.018);
  389. (_envSHG[2].w = 0.0);
  390. (_envSHG[3].x = 0.134);
  391. (_envSHG[3].y = 0.145);
  392. (_envSHG[3].z = -0.118);
  393. (_envSHG[3].w = 0.466);
  394. // _envSHB = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
  395. (_envSHB[0].x = 0.036);
  396. (_envSHB[0].y = 0.0);
  397. (_envSHB[0].z = 0.0);
  398. (_envSHB[0].w = 0.0);
  399. (_envSHB[1].x = 0.091);
  400. (_envSHB[1].y = -0.036);
  401. (_envSHB[1].z = 0.0);
  402. (_envSHB[1].w = 0.0);
  403. (_envSHB[2].x = -0.025);
  404. (_envSHB[2].y = -0.091);
  405. (_envSHB[2].z = 0.012);
  406. (_envSHB[2].w = 0.0);
  407. (_envSHB[3].x = 0.14);
  408. (_envSHB[3].y = 0.142);
  409. (_envSHB[3].z = -0.126);
  410. (_envSHB[3].w = 0.394);
  411. float3 tmpvar_42;
  412. tmpvar_42.x = dot (tmpvar_41, mul(_envSHR , tmpvar_41));
  413. tmpvar_42.y = dot (tmpvar_41, mul(_envSHG , tmpvar_41));
  414. tmpvar_42.z = dot (tmpvar_41, mul(_envSHB , tmpvar_41));
  415. half3 sRGB = tmpvar_42;
  416. half3 SHColor = GammaToLinearSpace(sRGB);
  417. return SHColor;
  418. }
  419. half3 IBL(half3 linearAlbedo, half3 metalSmooth, float NDotV, float3 reflectonDir){
  420. float roughnessLod = (0.04859 + 14.8158 * metalSmooth.r) - (7.45063 * metalSmooth.r) * metalSmooth.r;
  421. float refDirTexcoordV = abs(reflectonDir.y) * -0.03102955 + 0.086566716;
  422. refDirTexcoordV = abs(reflectonDir.y) * refDirTexcoordV - 0.2146018;
  423. refDirTexcoordV = abs(reflectonDir.y) * refDirTexcoordV + UNITY_HALF_PI;
  424. refDirTexcoordV = UNITY_HALF_PI - sqrt(1.0 - abs(reflectonDir.y)) * refDirTexcoordV;
  425. refDirTexcoordV = UNITY_HALF_PI - sign(reflectonDir.y) * refDirTexcoordV;
  426. float refDirU = (min (abs(reflectonDir.z / reflectonDir.x), 1.0) / max (abs(reflectonDir.z / reflectonDir.x), 1.0));
  427. float SqrtRefDirTexcoordU = refDirU * refDirU;
  428. float refDirTexcoordU = -0.01213232 * SqrtRefDirTexcoordU + 0.053681381;
  429. refDirTexcoordU = refDirTexcoordU * SqrtRefDirTexcoordU - 0.1173503;
  430. refDirTexcoordU = refDirTexcoordU * SqrtRefDirTexcoordU + 0.19389249;
  431. refDirTexcoordU = refDirTexcoordU * SqrtRefDirTexcoordU - 0.33267561;
  432. refDirTexcoordU = refDirTexcoordU * SqrtRefDirTexcoordU + 0.99997932;
  433. refDirTexcoordU = refDirTexcoordU * refDirU;
  434. refDirTexcoordU = refDirTexcoordU + (abs(reflectonDir.z / reflectonDir.x) > 1.0) * ((refDirTexcoordU * -2.0) + UNITY_HALF_PI);
  435. refDirTexcoordU = refDirTexcoordU * sign(reflectonDir.z / reflectonDir.x);
  436. if (abs(reflectonDir.x) > (1e-08 * abs(reflectonDir.z))) {
  437. if (reflectonDir.x < 0.0) {
  438. if (reflectonDir.z >= 0.0) {
  439. refDirTexcoordU += UNITY_PI;
  440. } else {
  441. refDirTexcoordU = (refDirTexcoordU - UNITY_PI);
  442. };
  443. };
  444. } else {
  445. refDirTexcoordU = (sign(reflectonDir.z) * UNITY_HALF_PI);
  446. };
  447. float2 uv;
  448. uv.x = clamp ((0.5 + refDirTexcoordU / UNITY_TWO_PI), 0.0, 1.0);
  449. uv.y = 1.0 - clamp (refDirTexcoordV / UNITY_PI, 0.0, 1.0);
  450. fixed4 envRefCol = tex2Dlod (_EnvironmentTex, float4(uv, 0, roughnessLod));
  451. float3 envCol = envRefCol.xyz * envRefCol.w;
  452. float4 roughnessCol = metalSmooth.r * float4(-1.0, -0.0275, -0.572, 0.022) + float4(1.0, 0.0425, 1.04, -0.04);
  453. float2 roughness = float2(-1.04, 1.04) * (min ((roughnessCol.x * roughnessCol.x), exp2(-9.28 * NDotV)) * roughnessCol.x + roughnessCol.y) + roughnessCol.zw;
  454. float3 albedoCol = lerp (0.04, linearAlbedo, metalSmooth.g);
  455. float roughnessRim = clamp ((roughness.y - 0.01), 0.0, 1.0);
  456. half3 envSpecular = (((albedoCol * roughness.x) + roughnessRim) * (18.84956 * (envCol * envCol))) * _EnvExposure;
  457. return envSpecular;
  458. }
  459. inline float3 BoxProjection(float3 direction, float3 position, float4 cubemapPosition, float3 boxMin, float3 boxMax){
  460. #if UNITY_SPECCUBE_BOX_PROJECTION
  461. UNITY_BRANCH
  462. if(cubemapPosition.w > 0){
  463. float3 factors = ((direction > 0 ? boxMax : boxMin) - position) / direction;
  464. float scalar = min(min(factors.x, factors.y), factors.z);
  465. direction = direction * scalar + (position - cubemapPosition);
  466. }
  467. #endif
  468. return direction;
  469. }
  470. inline half3 SHEval(half3 normal) {
  471. half4 n = half4(normal, 1.0);
  472. half3 x1, x2, x3;
  473. // Linear + constant polynomial terms
  474. x1.r = dot(unity_SHAr,n);
  475. x1.g = dot(unity_SHAg,n);
  476. x1.b = dot(unity_SHAb,n);
  477. // 4 of the quadratic polynomials
  478. half4 vB = n.xyzz * n.yzzx;
  479. x2.r = dot(unity_SHBr,vB);
  480. x2.g = dot(unity_SHBg,vB);
  481. x2.b = dot(unity_SHBb,vB);
  482. // Final quadratic polynomial
  483. half vC = n.x*n.x - n.y*n.y;
  484. x3 = unity_SHC.rgb * vC;
  485. return x1 + x2 + x3;
  486. }
  487. inline half3 DarkCornerColor(in float3 col, float3 viewDir){
  488. float camSpaceDir = mul(unity_MatrixV, float4(viewDir, 0)).z;
  489. float squCamSpaceDir = camSpaceDir * camSpaceDir;
  490. float biquCamSpaceDir = squCamSpaceDir * squCamSpaceDir;
  491. float dark = biquCamSpaceDir * biquCamSpaceDir;
  492. dark = dark * dark;
  493. float3 darkCornerColor = (dark + _DarkCornerColor) - (dark * _DarkCornerColor);
  494. _HeroShowOverallExposureColor = fixed4(1,1,1,1);
  495. return col * (_HeroShowOverallExposureColor.xyz * darkCornerColor);
  496. }
  497. UnityIndirect CreateGI(half3 normal, float3 refDir, float3 worldPos, half roughness){
  498. UnityIndirect indirectLight;
  499. indirectLight.diffuse = 0;
  500. indirectLight.specular = 0;
  501. indirectLight.diffuse = max (SHEval(normal), 0.0);
  502. Unity_GlossyEnvironmentData envData;
  503. envData.roughness = roughness;
  504. envData.reflUVW = BoxProjection(refDir, worldPos.xyz, unity_SpecCube0_ProbePosition, unity_SpecCube0_BoxMin, unity_SpecCube0_BoxMax);
  505. indirectLight.specular = Unity_GlossyEnvironment(UNITY_PASS_TEXCUBE(unity_SpecCube0), unity_SpecCube0_HDR, envData);
  506. return indirectLight;
  507. }
  508. half4 BRDF_KingHonour_PBS(v2f i, float4 worldPos, half3 linearAlbedo, half3 albedo, half3 metalSmooth, half3 normal, float3 viewDir, float3 refDir, half3 effCol, float NDotH, float VDotH, float NDotV, float atten, UnityLight light){
  509. half3 diffColor = linearAlbedo * (1.0 - metalSmooth.g);
  510. half3 specColor = lerp (0.04, linearAlbedo, metalSmooth.g);
  511. float skinMask = clamp ((effCol.r - 0.1), 0.0, 1.0) * 1.1 * _SkinSSSTransmission;
  512. float3 skinRim = ((float3(0.66, 2.34, 2.34) * ((albedo.y * albedo.z) * _SkinSSSfresnelMask)) * ((1.0 - NDotV) * (1.0 - NDotV))) * skinMask;
  513. float oneMinusNDotV = 1.0 - NDotV;
  514. float rimEnv = lerp (metalSmooth.z * metalSmooth.z, 1.0, (oneMinusNDotV * oneMinusNDotV));
  515. //half3 shColor = SH(normal, refDir);
  516. //shColor *= _SHExposure;
  517. UnityIndirect indirectLight = CreateGI(normal, refDir, worldPos, metalSmooth.r);
  518. half3 shColor = indirectLight.diffuse * _SHExposure;
  519. half3 scatterColor = (_SkinSSSScatterColor * skinMask).xyz;
  520. half3 tmpvar_59 = _DirLightColor.xyz;// * i.worldPos.w;
  521. ///Shadow Color
  522. half3 scatterCol = min (light.ndotl, atten) + scatterColor;
  523. float3 shAndSkinColor = shColor * rimEnv + max (lerp(scatterCol * _ShadowCol , scatterCol , atten) / (scatterColor + 1.0), 0.0) * _DirLightExposure * tmpvar_59;
  524. ///
  525. //float3 shAndSkinColor = shColor * rimEnv + max (((min (light.ndotl, atten) + scatterColor) / (scatterColor + 1.0)), 0.0) * _DirLightExposure * tmpvar_59;
  526. float d = D(NDotH, metalSmooth.r);
  527. float g = G(light.ndotl, NDotV, metalSmooth.r);
  528. half3 f = F(VDotH, specColor);
  529. //half3 specCol = tmpvar_59 * d * g * f * light.ndotl * atten;
  530. ///Shadow Color
  531. half3 specCol = tmpvar_59 * d * g * f * light.ndotl;
  532. specCol = lerp(specCol * _ShadowCol, specCol, atten);
  533. ///
  534. //branch realtime 4pointLight with in struct's normal.w
  535. UNITY_BRANCH
  536. if(i.wNormal.w > 0.0){
  537. float3 vertexCol;
  538. half3 pointCol = Shade4PointLightsSpecCol(worldPos, normal, viewDir, metalSmooth.r, skinMask, NDotV, specColor, vertexCol);
  539. shAndSkinColor += vertexCol;
  540. specCol += pointCol;
  541. }
  542. //half3 envSpecular = IBL(linearAlbedo, metalSmooth, NDotV, refDir);
  543. half3 envSpecular = GammaToLinearSpace(indirectLight.specular);
  544. float4 roughnessCol = metalSmooth.r * float4(-1.0, -0.0275, -0.572, 0.022) + float4(1.0, 0.0425, 1.04, -0.04);
  545. float2 roughness = float2(-1.04, 1.04) * (min ((roughnessCol.x * roughnessCol.x), exp2(-9.28 * NDotV)) * roughnessCol.x + roughnessCol.y) + roughnessCol.zw;
  546. float roughnessRim = clamp ((roughness.y - 0.01), 0.0, 1.0);
  547. envSpecular = (((specColor * roughness.x) + roughnessRim) * (18.84956 * (envSpecular * (envSpecular + _envBDRFFactor)))) * _EnvExposure;
  548. ///Right indirect specular color
  549. float surfaceReduction = 1.0 / (roughness * roughness + 1.0); //Liner空间
  550. float oneMinusReflectivity = 1 - max(max(specColor.r, specColor.g), specColor.b);
  551. float grazingTerm = saturate(1 - metalSmooth.r + (1 - oneMinusReflectivity));
  552. half3 rightIndirSpec = surfaceReduction * FresnelLerp(specColor, grazingTerm, NDotV);
  553. ///
  554. specCol = specCol * _PunctualLightSpecularExposure + envSpecular * rimEnv * rightIndirSpec;
  555. float emissiveMask = clamp ((effCol.y - 0.1), 0.0, 1.0) * 1.1 * _EmissionExposure;
  556. float3 emissiveCol = (emissiveMask * linearAlbedo) * _EmissionCol;
  557. half3 col = (shAndSkinColor * diffColor + skinRim) + (specCol + emissiveCol);
  558. //half3 col = specCol;
  559. col = DarkCornerColor(col, viewDir);
  560. half4 finalCol;
  561. finalCol.w = 1.0;
  562. #ifdef MANUAL_LINEAR_SPACE
  563. float bloomFactor = sqrt(max ((dot (col, float3(0.299, 0.587, 0.114)) - _Global_BloomThreshold), 0.0) * _BloomIntensity);
  564. bloomFactor = bloomFactor / (1.0 + bloomFactor);
  565. finalCol.w = bloomFactor;
  566. finalCol.rgb = (col / (col + 0.187)) * 1.035;
  567. #else
  568. col = (col * ((2.51 * col) + 0.03)) / ((col * ((2.43 * col) + 0.59)) + 0.14);
  569. finalCol.rgb = LinearToGammaSpace(col);
  570. #endif
  571. return finalCol;
  572. }
  573. ENDCG
  574. SubShader
  575. {
  576. Tags { "Queue" = "Geometry" "RenderType"="Opaque" "MirrorReplace" = "Mirror" "ignoreprojector" = "true" }
  577. LOD 500
  578. Pass{
  579. Name "ForwardLit"
  580. Tags { "LightMode"="UniversalForward"}
  581. CGPROGRAM
  582. #pragma vertex vert
  583. #pragma fragment frag
  584. #pragma multi_compile_fwdbase
  585. //#pragma shader_feature _ _SGAME_HIGH_QUALITY_SHADOW_ON MANUAL_LINEAR_SPACE
  586. #pragma target 3.0
  587. //#define _SGAME_HIGH_QUALITY_SHADOW_ON
  588. //#define MANUAL_LINEAR_SPACE
  589. v2f vert (appdata_full v)
  590. {
  591. v2f o;
  592. UNITY_SETUP_INSTANCE_ID(v);
  593. UNITY_INITIALIZE_OUTPUT(v2f, o);
  594. o.pos = UnityObjectToClipPos(v.vertex);
  595. o.uv.xy = TRANSFORM_TEX(v.texcoord.xy, _MainTex);
  596. float4 worldVertex = mul(unity_ObjectToWorld, v.vertex);
  597. o.wNormal.xyz = UnityObjectToWorldNormal(v.normal);
  598. /*
  599. /////
  600. float4 shadowPos_9;
  601. float4 shadowVertex = mul(_SGameShadowMatrix , worldVertex);
  602. shadowPos_9.w = shadowVertex.w;
  603. shadowPos_9.xyz = (shadowVertex.xyz / shadowVertex.w);
  604. shadowPos_9.xyz = shadowPos_9.xyz * 0.5 + 0.5;
  605. o.shadowPos.xyz = shadowPos_9.xyz;
  606. /////
  607. //////
  608. o.viewPos = mul(UNITY_MATRIX_V, worldVertex);
  609. float3 lightDir = (worldVertex.xyz - _DirLightPos.xyz);
  610. _SGameShadowParams.xyz = -_WorldSpaceLightPos0.xyz;
  611. float NDotV = dot (lightDir, _SGameShadowParams.xyz);
  612. float3 x_15 = (lightDir - (NDotV * _SGameShadowParams.xyz));
  613. float x_17 = (clamp ((1.0 - ((sqrt(dot (x_15, x_15)) - _DirLightRanges.x) / (_DirLightRanges.y - _DirLightRanges.x))), 0.0, 1.0) + 0.0001);
  614. half NDotL = pow (x_17, _DirLightAttens.x);
  615. float atten1_12 = NDotL;
  616. float x_19 = (clamp ((1.0 - ((NDotV - _DirLightRanges.z) / (_DirLightRanges.w - _DirLightRanges.z)).x), 0.0, 1.0) + 0.0001);
  617. half tmpvar_18 = pow (x_19, _DirLightAttens.y);
  618. float atten2_11 = tmpvar_18;
  619. worldVertex.w = max (atten1_12 * atten2_11, _DirLightAttens.z);
  620. //////
  621. #ifdef _SGAME_POINT_LIGHT_ON
  622. _PointLightPosAndRange = fixed4(-29.167,-30.527,106.016,2.3);
  623. float3 tmpvar_20 = ((worldVertex.xyz - _PointLightPosAndRange.xyz) / _PointLightPosAndRange.w);
  624. _PointLightColorAndAtten = fixed4(0,0,0,3.1);
  625. o.shadowPos.w = pow (clamp ((1.0 - dot (tmpvar_20, tmpvar_20)), 0.0, 1.0), (_PointLightColorAndAtten.w + 0.001));
  626. #else
  627. o.shadowPos.w = clamp (dot (-(o.wNormal), normalize(_SGameShadowParams.xyz)), 0.0, 1.0);
  628. #endif
  629. */
  630. #ifdef VERTEXLIGHT_ON
  631. o.wNormal.w = 1.0;
  632. #else
  633. o.wNormal.w = 0.0;
  634. #endif
  635. o.worldPos = worldVertex;
  636. o.wTangent.xyz = UnityObjectToWorldDir(v.tangent.xyz);
  637. o.wTangent.w = v.tangent.w;
  638. //We need this for shadow receving
  639. UNITY_TRANSFER_LIGHTING(o, v.texcoord1);
  640. return o;
  641. }
  642. fixed4 frag (v2f i) : SV_Target
  643. {
  644. half v_ClothMask1 = tex2D(_ClothMask1, i.uv.xy).r;//_ClothMask1.Sample(sampler_ClothMask1, input.uv.xy).r;
  645. clip(v_ClothMask1 - 0.5);
  646. half v_ClothMask2 = tex2D(_ClothMask2, i.uv.xy).r;
  647. clip(v_ClothMask2 - 0.5);
  648. half v_ClothMask3 = tex2D(_ClothMask3, i.uv.xy).r;
  649. clip(v_ClothMask3 - 0.5);
  650. UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i);
  651. half3 albedo = GetAlbedo(i);
  652. half3 linearAlbedo = GammaToLinearSpace(albedo);
  653. linearAlbedo = AddMaskColor(linearAlbedo,i.uv.xy).rgb;
  654. float3 metalSmooth = GetMetalSmooth(i);
  655. half3 effCol = GetEmission(i);
  656. float4 worldPos = i.worldPos;
  657. UnityLight light;
  658. light.dir = UnityWorldSpaceLightDir(worldPos);
  659. #ifndef USING_DIRECTIONAL_LIGHT
  660. light.dir = normalize(light.dir);
  661. #endif
  662. light.color = _LightColor0.rgb;
  663. InitializeFragmentNormal(i);
  664. half3 worldNormal = i.wNormal.xyz;
  665. float3 viewDir = normalize(UnityWorldSpaceViewDir(worldPos));
  666. float3 refLight = reflect(-viewDir, worldNormal);
  667. float NDotV = clamp(dot(worldNormal, viewDir), 0.01, 1.0);
  668. light.ndotl = clamp(dot(worldNormal, light.dir), _CosMin, 1.0);
  669. float3 halfDir = Unity_SafeNormalize(float3(light.dir) + viewDir);
  670. //float NDotH = saturate(dot(worldNormal, halfDir));
  671. //float VDotH = saturate(dot(viewDir, halfDir));
  672. float NDotH = clamp(dot(worldNormal, halfDir), _CosMin, 1.0);
  673. float VDotH = clamp(dot(viewDir, halfDir), 0.01, 1.0);
  674. UNITY_LIGHT_ATTENUATION(atten, i, worldPos.xyz);
  675. atten = max(atten, _ShadowDarkness);
  676. half4 col = BRDF_KingHonour_PBS(i, worldPos, linearAlbedo, albedo, metalSmooth, worldNormal, viewDir, refLight, effCol, NDotH, VDotH, NDotV, atten, light);
  677. col = saturate(col);
  678. return col;
  679. }
  680. ENDCG
  681. }
  682. //Pass{
  683. // Blend One One
  684. // Name "Bloom_Mask"
  685. // Tags { "LightMode"="ForwardAdd"}
  686. // CGPROGRAM
  687. // #pragma vertex vert_Bloom
  688. // #pragma fragment frag_Bloom
  689. // #pragma exclude_renderers xboxone ps4 psp2 n3ds wiiu
  690. // struct v2f_Bloom
  691. // {
  692. // float4 pos : SV_POSITION;
  693. // float4 uv : TEXCOORD0;
  694. // };
  695. // sampler2D _BloomTex;
  696. // v2f_Bloom vert_Bloom(appdata_base v){
  697. // v2f_Bloom o;
  698. // UNITY_INITIALIZE_OUTPUT(v2f_Bloom, o);
  699. // o.pos = UnityObjectToClipPos(v.vertex);
  700. // o.uv.xy = v.texcoord.xy;
  701. // return o;
  702. // }
  703. // half4 frag_Bloom(v2f_Bloom i):SV_Target{
  704. // half4 bloomMask = tex2D(_BloomTex, i.uv);
  705. // return bloomMask;
  706. // }
  707. // ENDCG
  708. //}
  709. Pass {
  710. Name"ShadowCaster"
  711. Tags{"LightMode" = "ShadowCaster"}
  712. CGPROGRAM
  713. #pragma vertex ShadowVertex
  714. #pragma fragment ShadowFrag
  715. #pragma glsl_no_auto_normalization
  716. #pragma exclude_renderers xboxone ps4 psp2 n3ds wiiu
  717. //#include "UnityCG.cginc"
  718. #if defined(_RENDERING_FADE) || defined(_RENDERING_TRANSPARENT)
  719. #if defined(_SEMITRANSPARENT_SHADOWS)
  720. #define SHADOWS_SEMITRANSPARENT 1
  721. #else
  722. #define _RENDERING_CUTOUT
  723. #endif
  724. #endif
  725. #if SHADOWS_SEMITRANSPARENT || defined(_RENDERING_CUTOUT)
  726. #if !defined(_SMOOTHNESS_METALLIC)
  727. #define SHADOWS_NEED_UV 1
  728. #endif
  729. #endif
  730. float _CutOff;
  731. sampler3D _DitherMaskLOD;
  732. struct VertexData {
  733. float4 position : POSITION;
  734. float3 normal : NORMAL;
  735. float2 uv : TEXCOORD0;
  736. UNITY_VERTEX_INPUT_INSTANCE_ID
  737. };
  738. struct InterpolatorsVertex {
  739. float4 position : SV_POSITION;
  740. #if SHADOWS_NEED_UV
  741. float2 uv : TEXCOORD0;
  742. #endif
  743. #if defined(SHADOWS_CUBE)
  744. float3 lightVec : TEXCOORD1;
  745. #endif
  746. UNITY_VERTEX_INPUT_INSTANCE_ID
  747. };
  748. struct Interpolators {
  749. #if SHADOWS_SEMITRANSPARENT
  750. float4 vpos : VPOS;
  751. #else
  752. float4 positions : SV_POSITION;
  753. #endif
  754. #if SHADOWS_NEED_UV
  755. float2 uv : TEXCOORD0;
  756. #endif
  757. #if defined(SHADOWS_CUBE)
  758. float3 lightVec : TEXCOORD1;
  759. #endif
  760. UNITY_VERTEX_INPUT_INSTANCE_ID
  761. };
  762. float GetAlpha (Interpolators i) {
  763. float alpha = 1.0;
  764. #if SHADOWS_NEED_UV
  765. alpha *= tex2D(_MainTex, i.uv.xy).a;
  766. #endif
  767. return alpha;
  768. }
  769. half RoughnessSetup_ShadowGetOneMinusReflectivity(half2 uv)
  770. {
  771. half metallicity = _Metalness;
  772. #ifdef _GLOSSMAP
  773. metallicity = tex2D(_MetalSmoothTex, uv).g;
  774. #endif
  775. return OneMinusReflectivityFromMetallic(metallicity);
  776. }
  777. InterpolatorsVertex ShadowVertex (VertexData v) {
  778. UNITY_SETUP_INSTANCE_ID(v);
  779. InterpolatorsVertex i;
  780. UNITY_INITIALIZE_OUTPUT(InterpolatorsVertex, i);
  781. UNITY_TRANSFER_INSTANCE_ID(v,i);
  782. UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(i);
  783. #if defined(SHADOWS_CUBE)
  784. i.position = UnityObjectToClipPos(v.position);
  785. i.lightVec =
  786. mul(unity_ObjectToWorld, v.position).xyz - _LightPositionRange.xyz;
  787. #else
  788. i.position = UnityClipSpaceShadowCasterPos(v.position.xyz, v.normal);
  789. i.position = UnityApplyLinearShadowBias(i.position);
  790. #endif
  791. #if SHADOWS_NEED_UV
  792. i.uv = TRANSFORM_TEX(v.uv, _MainTex);
  793. #endif
  794. return i;
  795. }
  796. float4 ShadowFrag (Interpolators i) : SV_TARGET {
  797. UNITY_SETUP_INSTANCE_ID(i);
  798. float alpha = GetAlpha(i);
  799. #if defined(_RENDERING_CUTOUT)
  800. clip(alpha - _CutOff);
  801. #endif
  802. #if SHADOWS_SEMITRANSPARENT
  803. #if defined(_ALPHAPREMULTIPLY_ON)
  804. half outModifiedAlpha;
  805. PreMultiplyAlpha(half3(0, 0, 0), alpha, RoughnessSetup_ShadowGetOneMinusReflectivity(i.uv), outModifiedAlpha);
  806. alpha = outModifiedAlpha;
  807. #endif
  808. float dither =
  809. tex3D(_DitherMaskLOD, float3(i.vpos.xy * 0.25, alpha * 0.9375)).a;
  810. clip(dither - 0.01);
  811. #endif
  812. #if defined(SHADOWS_CUBE)
  813. float depth = length(i.lightVec) + unity_LightShadowBias.x;
  814. depth *= _LightPositionRange.w;
  815. return UnityEncodeCubeShadowDepth(depth);
  816. #else
  817. return 0;
  818. #endif
  819. }
  820. ENDCG
  821. }
  822. }
  823. }// Category
  824. }