skin.effect 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349
  1. // Copyright (c) 2017-2022 Xiamen Yaji Software Co., Ltd.
  2. CCEffect %{
  3. techniques:
  4. - name: opaque
  5. passes:
  6. - vert: standard-vs
  7. frag: standard-fs
  8. embeddedMacros: { CC_SURFACES_LIGHTING_DISABLE_DIFFUSE: false, CC_SURFACES_LIGHTING_DISABLE_SPECULAR: true }
  9. properties: &props
  10. tilingOffset: { value: [1.0, 1.0, 0.0, 0.0] }
  11. mainColor: { value: [1.0, 1.0, 1.0, 1.0], target: albedo, linear: true, editor: { displayName: Albedo, type: color } }
  12. albedoScale: { value: [1.0, 1.0, 1.0], target: albedoScaleAndCutoff.xyz }
  13. alphaThreshold: { value: 0.5, target: albedoScaleAndCutoff.w, editor: { parent: USE_ALPHA_TEST, slide: true, range: [0, 1.0], step: 0.001 } }
  14. occlusion: { value: 0.0, target: pbrParams.x, editor: { slide: true, range: [0, 1.0], step: 0.001 } }
  15. roughness: { value: 0.5, target: pbrParams.y, editor: { slide: true, range: [0, 1.0], step: 0.001 } }
  16. specularIntensity: { value: 0.5, target: pbrParams.w, editor: { slide: true, range: [0.0, 1.0], step: 0.001 } }
  17. normalStrength: { value: 1.0, target: emissiveScaleParam.w, editor: { parent: USE_NORMAL_MAP, slide: true, range: [0, 5.0], step: 0.001 } }
  18. mainTexture: { value: grey, target: albedoMap, editor: { displayName: AlbedoMap } }
  19. normalMap: { value: normal }
  20. pbrMap: { value: grey, editor: { displayName: PbrOrRoughnessMap } }
  21. occlusionMap: { value: white }
  22. sssIntensity: { value: 1.0, target: scatterParams.z, editor: { slide: true, range: [0, 1.0], step: 0.001 } }
  23. sssMap: { value: black }
  24. cavityMap: { value: white, editor: { tooltip: 'cavity map or specular map' } }
  25. maskMap: { value: black, editor: { parent: USE_BACK_LIT } }
  26. thickness: { value: 0.0, target: scatterParams.x, editor: { parent: USE_BACK_LIT, displayName: Object Thickness, range: [0, 1000.0], tooltip: 'i18n:ENGINE.assets.effect.propertyTips.transmitThicknessWithShadowMap' } }
  27. extinction: { value: 0.0, target: scatterParams.y, editor: { parent: USE_BACK_LIT, displayName: Transmit Scatter Extinction, slide: true, range: [0, 10.0], step: 0.001, tooltip: 'i18n:ENGINE.assets.effect.propertyTips.transmitExtinctionWithShadowMap' } }
  28. transmitColor: { value: [1.0, 0.2, 0.1, 1.0], linear: true, editor: { parent: USE_BACK_LIT, displayName: Transmit Scatter Color, type: color, tooltip: 'The color of scattered lighting, red for human skin' } }
  29. dualLobeRoughness: { value: 0.5, target: dualLobeParams.x, editor: { parent: USE_DUAL_LOBE_SPECULAR, range: [0, 1.0] } }
  30. dualLobeIntensity: { value: 0.02, target: dualLobeParams.w, editor: { parent: USE_DUAL_LOBE_SPECULAR, slide: true, range: [0, 0.1], step: 0.001 } }
  31. rasterizerState: &r1
  32. cullMode: None
  33. depthStencilState: &d1
  34. depthFunc: less_equal
  35. depthTest: true
  36. depthWrite: true
  37. stencilTestFront: true
  38. stencilPassOpFront: replace
  39. stencilRef: 0x78 # [0~255],use 120
  40. - vert: standard-vs
  41. frag: standard-fs
  42. phase: forward-add
  43. propertyIndex: 0
  44. embeddedMacros: { CC_FORWARD_ADD: true, CC_SURFACES_LIGHTING_DISABLE_DIFFUSE: false, CC_SURFACES_LIGHTING_DISABLE_SPECULAR: true }
  45. depthStencilState:
  46. depthFunc: equal
  47. depthTest: true
  48. depthWrite: false
  49. blendState:
  50. targets:
  51. - blend: true
  52. blendSrc: one
  53. blendDst: one
  54. blendSrcAlpha: zero
  55. blendDstAlpha: one
  56. - vert: shadow-caster-vs
  57. frag: shadow-caster-fs
  58. phase: shadow-caster
  59. propertyIndex: 0
  60. rasterizerState:
  61. cullMode: none
  62. properties:
  63. tilingOffset: { value: [1.0, 1.0, 0.0, 0.0] }
  64. mainColor: { value: [1.0, 1.0, 1.0, 1.0], target: albedo, editor: { displayName: Albedo, type: color } }
  65. albedoScale: { value: [1.0, 1.0, 1.0], target: albedoScaleAndCutoff.xyz }
  66. alphaThreshold: { value: 0.5, target: albedoScaleAndCutoff.w, editor: { parent: USE_ALPHA_TEST } }
  67. mainTexture: { value: grey, target: albedoMap, editor: { displayName: AlbedoMap } }
  68. - vert: standard-vs
  69. frag: standard-fs
  70. pass: specular-pass
  71. propertyIndex: 0
  72. embeddedMacros: { CC_SURFACES_LIGHTING_DISABLE_DIFFUSE: true, CC_SURFACES_LIGHTING_DISABLE_SPECULAR: false }
  73. depthStencilState:
  74. depthFunc: equal
  75. depthTest: true
  76. depthWrite: false
  77. stencilTestFront: true
  78. stencilFuncFront: equal
  79. stencilRef: 0x78 # [0~255],use 120
  80. blendState:
  81. targets:
  82. - blend: true
  83. blendSrc: one
  84. blendDst: one
  85. blendSrcAlpha: zero
  86. blendDstAlpha: one
  87. - vert: standard-vs
  88. frag: standard-fs
  89. pass: specular-pass
  90. phase: forward-add
  91. propertyIndex: 0
  92. embeddedMacros: { CC_FORWARD_ADD: true, CC_SURFACES_LIGHTING_DISABLE_DIFFUSE: true, CC_SURFACES_LIGHTING_DISABLE_SPECULAR: false }
  93. depthStencilState:
  94. depthFunc: equal
  95. depthTest: true
  96. depthWrite: false
  97. stencilTestFront: true
  98. stencilFuncFront: equal
  99. stencilRef: 0x78 # [0~255],use 120
  100. blendState:
  101. targets:
  102. - blend: true
  103. blendSrc: one
  104. blendDst: one
  105. blendSrcAlpha: zero
  106. blendDstAlpha: one
  107. - vert: standard-vs
  108. frag: standard-fs
  109. phase: deferred-forward
  110. propertyIndex: 0
  111. embeddedMacros: { CC_SURFACES_LIGHTING_DISABLE_DIFFUSE: false, CC_SURFACES_LIGHTING_DISABLE_SPECULAR: true }
  112. rasterizerState: *r1
  113. depthStencilState: *d1
  114. }%
  115. CCProgram shared-ubos %{
  116. uniform Constants {
  117. vec4 tilingOffset;
  118. vec4 albedo;
  119. vec4 albedoScaleAndCutoff;
  120. vec4 pbrParams;
  121. vec4 emissiveScaleParam;
  122. vec4 transmitColor;
  123. vec4 scatterParams;
  124. vec4 dualLobeParams;
  125. };
  126. }%
  127. CCProgram macro-remapping %{
  128. // ui displayed macros
  129. #pragma define-meta HAS_SECOND_UV
  130. #pragma define-meta USE_TWOSIDE
  131. #pragma define-meta USE_VERTEX_COLOR
  132. #pragma define-meta USE_BACK_LIT
  133. #pragma define-meta USE_DUAL_LOBE_SPECULAR
  134. #define CC_SURFACES_USE_SECOND_UV HAS_SECOND_UV
  135. #define CC_SURFACES_USE_TWO_SIDED USE_TWOSIDE
  136. #define CC_SURFACES_USE_VERTEX_COLOR USE_VERTEX_COLOR
  137. #define CC_SURFACES_LIGHTING_DUAL_LOBE_SPECULAR USE_DUAL_LOBE_SPECULAR
  138. #define CC_SURFACES_LIGHTING_TRANSMIT_DIFFUSE USE_BACK_LIT
  139. #define CC_SURFACES_LIGHTING_USE_SHADOWMAP_TRANSMIT USE_BACK_LIT
  140. #define CC_SURFACES_LIGHTING_SSS 1
  141. // depend on UI macros
  142. #if USE_NORMAL_MAP
  143. #define CC_SURFACES_USE_TANGENT_SPACE 1
  144. #endif
  145. }%
  146. CCProgram surface-vertex %{
  147. }%
  148. CCProgram surface-fragment %{
  149. #if USE_ALBEDO_MAP
  150. uniform sampler2D albedoMap;
  151. #pragma define-meta ALBEDO_UV options([v_uv, v_uv1])
  152. #endif
  153. #if USE_NORMAL_MAP
  154. uniform sampler2D normalMap;
  155. #pragma define-meta NORMAL_UV options([v_uv, v_uv1])
  156. #endif
  157. #pragma define-meta DEFAULT_UV options([v_uv, v_uv1])
  158. #if USE_PBR_MAP
  159. uniform sampler2D pbrMap;
  160. #endif
  161. #if USE_OCCLUSION_MAP
  162. uniform sampler2D occlusionMap;
  163. #endif
  164. #if USE_SSS_MAP
  165. uniform sampler2D sssMap;
  166. #endif
  167. #pragma define OCCLUSION_CHANNEL r
  168. #pragma define ROUGHNESS_CHANNEL g
  169. #pragma define METALLIC_CHANNEL b
  170. #pragma define SPECULAR_INTENSITY_CHANNEL a
  171. #if USE_ALPHA_TEST
  172. #pragma define-meta ALPHA_TEST_CHANNEL options([a, r])
  173. #endif
  174. //////////////////User Defines
  175. #if USE_BACK_LIT
  176. uniform sampler2D maskMap;
  177. #endif
  178. uniform sampler2D cavityMap;
  179. #define CC_SURFACES_FRAGMENT_MODIFY_TRANSMIT_SCATTERING_PARAMS
  180. vec4 SurfacesFragmentModifyTransmitScatteringParams()
  181. {
  182. return vec4(scatterParams.y * 50.0, 0.0, 1.0, 0.01);
  183. }
  184. #define CC_SURFACES_FRAGMENT_MODIFY_TRANSMIT_DIFFUSE_PARAMS
  185. vec4 SurfacesFragmentModifyTransmitDiffuseParams()
  186. {
  187. float mask = 1.0;
  188. #if USE_BACK_LIT
  189. mask = texture(maskMap, FSInput_texcoord).x;
  190. #endif
  191. return vec4(scatterParams.x, mask, 1.0, 1.0);
  192. }
  193. #define CC_SURFACES_FRAGMENT_MODIFY_TRANSMIT_IN_SCATTERING_COLOR
  194. vec3 SurfacesFragmentModifyTransmitInScatteringColor()
  195. {
  196. return vec3(0.0);//1.0, 0.2, 0.05);
  197. }
  198. #define CC_SURFACES_FRAGMENT_MODIFY_TRANSMIT_OUT_SCATTERING_COLOR
  199. vec3 SurfacesFragmentModifyTransmitOutScatteringColor()
  200. {
  201. return transmitColor.rgb;
  202. }
  203. #define CC_SURFACES_FRAGMENT_MODIFY_DUAL_LOBE_SPECULAR_PARAMS
  204. vec4 SurfacesFragmentModifyDualLobeSpecularParams(float roughness)
  205. {
  206. return vec4(dualLobeParams.x * roughness, 0.0, 0.0, dualLobeParams.w);
  207. }
  208. #define CC_SURFACES_FRAGMENT_MODIFY_SSS_PARAMS
  209. vec4 SurfacesFragmentModifySSSParams()
  210. {
  211. float sssStrength = scatterParams.z;
  212. #if USE_SSS_MAP
  213. sssStrength *= texture(sssMap, DEFAULT_UV).x;
  214. #endif
  215. return vec4(sssStrength, 0.0, 0.0, 0.0);
  216. }
  217. #define CC_SURFACES_FRAGMENT_MODIFY_PBRPARAMS
  218. vec4 SurfacesFragmentModifyPBRParams()
  219. {
  220. vec4 pbr = pbrParams;
  221. pbr.x = 1.0;
  222. pbr.z = 0.0;
  223. #if USE_PBR_MAP
  224. // ao and metallic ignored from pbrMap
  225. vec4 res = texture(pbrMap, DEFAULT_UV);
  226. pbr.y *= res.ROUGHNESS_CHANNEL;
  227. pbr.w *= res.SPECULAR_INTENSITY_CHANNEL;
  228. #endif
  229. #if USE_OCCLUSION_MAP
  230. pbr.x = mix(1.0, texture(occlusionMap, DEFAULT_UV).OCCLUSION_CHANNEL, pbrParams.x);
  231. #endif
  232. float cavity = texture(cavityMap, FSInput_texcoord).x;
  233. pbr.w *= cavity;
  234. return pbr;
  235. }
  236. #include <common-functions>
  237. #include <surfaces/default-functions/skin>
  238. #include <lighting-models/default-functions/skin>
  239. }%
  240. CCProgram standard-vs %{
  241. precision highp float;
  242. // 1. surface internal macros, for technique usage or remapping some user (material) macros to surface internal macros
  243. #include <macro-remapping>
  244. #include <surfaces/effect-macros/common-macros>
  245. // 2. common include with corresponding shader stage, include before surface functions
  246. #include <surfaces/includes/common-vs>
  247. // 3. user surface functions that can use user (effect) parameters (ubo Constants)
  248. // see surfaces/default-functions/xxx.chunk
  249. #include <shared-ubos>
  250. #include <surface-vertex>
  251. // 4. surface include with corresponding shader stage and shading-model (optional)
  252. #include <surfaces/includes/standard-vs>
  253. // 5. shader entry with corresponding shader stage and technique usage/type
  254. #include <shading-entries/main-functions/render-to-scene/vs>
  255. }%
  256. CCProgram shadow-caster-vs %{
  257. precision highp float;
  258. #include <macro-remapping>
  259. #include <surfaces/effect-macros/render-to-shadowmap>
  260. #include <surfaces/includes/common-vs>
  261. #include <shared-ubos>
  262. #include <surface-vertex>
  263. #include <shading-entries/main-functions/render-to-shadowmap/vs>
  264. }%
  265. CCProgram standard-fs %{
  266. // shading-model : standard
  267. // lighting-model : standard (isotropy / anisotropy pbr)
  268. // shader stage : fs
  269. // technique usage/type : render-to-scene
  270. precision highp float;
  271. // 1. surface internal macros, for technique usage or remapping some user (material) macros to surface internal macros
  272. #include <macro-remapping>
  273. #include <surfaces/effect-macros/common-macros>
  274. // 2. common include with corresponding shader stage, include before surface functions
  275. #include <surfaces/includes/common-fs>
  276. // 3. user surface functions that can use user (effect) parameters (ubo Constants)
  277. // see surfaces/default-functions/xxx.chunk
  278. #include <shared-ubos>
  279. #include <surface-fragment>
  280. // 4. lighting-model (optional)
  281. #include <lighting-models/includes/standard>
  282. // 5. surface include with corresponding shader stage and shading-model (optional)
  283. #include <surfaces/includes/standard-fs>
  284. // 6. shader entry with corresponding shader stage and technique usage/type
  285. #include <shading-entries/main-functions/render-to-scene/fs>
  286. }%
  287. CCProgram shadow-caster-fs %{
  288. precision highp float;
  289. #include <macro-remapping>
  290. #include <surfaces/effect-macros/render-to-shadowmap>
  291. #include <surfaces/includes/common-fs>
  292. #include <shared-ubos>
  293. #include <surface-fragment>
  294. #include <shading-entries/main-functions/render-to-shadowmap/fs>
  295. }%
  296. CCProgram reflect-map-fs %{
  297. precision highp float;
  298. #include <macro-remapping>
  299. #include <surfaces/effect-macros/common-macros>
  300. #include <surfaces/includes/common-fs>
  301. #include <shared-ubos>
  302. #include <surface-fragment>
  303. #include <lighting-models/includes/standard>
  304. #include <surfaces/includes/standard-fs>
  305. #include <shading-entries/main-functions/render-to-reflectmap/fs>
  306. }%