car-paint.effect 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400
  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. properties: &props
  9. tilingOffset: { value: [1.0, 1.0, 0.0, 0.0] }
  10. mainColor: { value: [1.0, 1.0, 1.0, 1.0], target: albedo, linear: true, editor: { displayName: Albedo, type: color } }
  11. albedoScale: { value: [1.0, 1.0, 1.0], target: albedoScaleAndCutoff.xyz }
  12. alphaThreshold: { value: 0.5, target: albedoScaleAndCutoff.w, editor: { parent: USE_ALPHA_TEST, slide: true, range: [0, 1.0], step: 0.001 } }
  13. occlusion: { value: 0.0, target: pbrParams.x, editor: { slide: true, range: [0, 1.0], step: 0.001 } }
  14. roughness: { value: 0.5, target: pbrParams.y, editor: { slide: true, range: [0, 1.0], step: 0.001 } }
  15. metallic: { value: 0.0, target: pbrParams.z, 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. addOnShadowBias: { value: 0.0, target: emissiveScaleParam.z }
  19. coatRoughness: { value: 0.05, target: coatParam.x, editor: { slide : true, range : [0, 1.0] , step : 0.0001 } }
  20. coatIOR: { value: 1.0, target: coatParam.y, editor: { slide : true, range : [1.0, 1.5] , step : 0.0001 } }
  21. coatOpacity: { value: 1.0, target: coatParam.z, editor: { slide : true, range : [0.0, 1.0] , step : 0.0001 } }
  22. coatIntensity: { value: 1.0, target: coatParam.w, editor: { slide : true, range : [0.0, 3.0] , step : 0.0001 } }
  23. coatColor: { value: [1.0, 1.0, 1.0, 1.0], linear: true, editor: { displayName: CoatColor, type: color } }
  24. flakeDensity: { value: 0.5, target: flakeParam.x, editor: { parent: USE_FLAKE, slide: true, range: [0, 1.0], step: 0.001 } }
  25. flakeColorIntensity: { value: 0.2, target: flakeParam.y, editor: { parent: USE_FLAKE, slide: true, range: [0, 1.0], step: 0.001 } }
  26. flakeTiling: { value: 10.0, target: flakeParam.z, editor: { parent: USE_FLAKE, slide: true, range: [1.0, 100.0], step: 0.001 } }
  27. coatNormalStrength: { value: 0.1, target: flakeParam.w, editor: { parent: USE_FLAKE, slide: true, range: [0, 1.0], step: 0.001 } }
  28. gradientColor: { value: [1.0, 1.0, 1.0, 1.0], linear: true, editor: { parent: USE_GRADIENT_COLOR, type: color } }
  29. gradientIntensity: { value: 0.5, target: emissiveScaleParam.y, editor: { parent: USE_GRADIENT_COLOR, slide: true, range: [0, 1.0], step: 0.001 } }
  30. mainTexture: { value: grey, target: albedoMap, editor: { displayName: AlbedoMap } }
  31. normalMap: { value: normal }
  32. coatDataMap: { value: white, editor: { parent: USE_COAT_DATA_MAP, tooltip: 'r: Coat Roughness g: Coat Specular Intensity b: Coat Opacity.' } }
  33. coatNormalMap: { value: normal, editor: { parent: USE_FLAKE } }
  34. flakeDataMap: { value: white, editor: { parent: USE_FLAKE } }
  35. pbrMap: { value: grey }
  36. occlusionMap: { value: white }
  37. - &forward-add
  38. vert: standard-vs
  39. frag: standard-fs
  40. phase: forward-add
  41. propertyIndex: 0
  42. embeddedMacros: { CC_FORWARD_ADD: true }
  43. depthStencilState:
  44. depthFunc: equal
  45. depthTest: true
  46. depthWrite: false
  47. blendState:
  48. targets:
  49. - blend: true
  50. blendSrc: one
  51. blendDst: one
  52. blendSrcAlpha: zero
  53. blendDstAlpha: one
  54. - &shadow-caster
  55. vert: shadow-caster-vs
  56. frag: shadow-caster-fs
  57. phase: shadow-caster
  58. propertyIndex: 0
  59. rasterizerState:
  60. cullMode: front
  61. properties:
  62. tilingOffset: { value: [1.0, 1.0, 0.0, 0.0] }
  63. mainColor: { value: [1.0, 1.0, 1.0, 1.0], target: albedo, editor: { displayName: Albedo, type: color } }
  64. albedoScale: { value: [1.0, 1.0, 1.0], target: albedoScaleAndCutoff.xyz }
  65. alphaThreshold: { value: 0.5, target: albedoScaleAndCutoff.w, editor: { parent: USE_ALPHA_TEST } }
  66. mainTexture: { value: grey, target: albedoMap, editor: { displayName: AlbedoMap } }
  67. - &reflect-map
  68. vert: standard-vs
  69. frag: reflect-map-fs
  70. phase: reflect-map
  71. propertyIndex: 0
  72. - &planar-shadow
  73. vert: planar-shadow-vs
  74. frag: planar-shadow-fs
  75. phase: planar-shadow
  76. propertyIndex: 0
  77. depthStencilState:
  78. depthTest: true
  79. depthWrite: false
  80. stencilTestFront: true
  81. stencilFuncFront: not_equal
  82. stencilPassOpFront: replace
  83. stencilRef: 0x80 # only use the leftmost bit
  84. stencilReadMask: 0x80
  85. stencilWriteMask: 0x80
  86. blendState:
  87. targets:
  88. - blend: true
  89. blendSrc: src_alpha
  90. blendDst: one_minus_src_alpha
  91. blendDstAlpha: one_minus_src_alpha
  92. - &deferred
  93. vert: standard-vs
  94. frag: standard-fs
  95. pass: gbuffer
  96. phase: gbuffer
  97. embeddedMacros: { CC_PIPELINE_TYPE: 1 }
  98. propertyIndex: 0
  99. - name: transparent
  100. passes:
  101. - vert: standard-vs
  102. frag: standard-fs
  103. embeddedMacros: { CC_FORCE_FORWARD_SHADING: true }
  104. depthStencilState: &d1
  105. depthTest: true
  106. depthWrite: false
  107. blendState: &b1
  108. targets:
  109. - blend: true
  110. blendSrc: src_alpha
  111. blendDst: one_minus_src_alpha
  112. blendDstAlpha: one_minus_src_alpha
  113. properties: *props
  114. - *forward-add
  115. - *shadow-caster
  116. - *planar-shadow
  117. - &deferred-forward
  118. vert: standard-vs
  119. frag: standard-fs
  120. phase: deferred-forward
  121. embeddedMacros: { CC_PIPELINE_TYPE: 0 }
  122. propertyIndex: 0
  123. depthStencilState: *d1
  124. blendState: *b1
  125. }%
  126. CCProgram shared-ubos %{
  127. uniform Constants {
  128. vec4 tilingOffset;
  129. vec4 albedo;
  130. vec4 albedoScaleAndCutoff;
  131. vec4 pbrParams;
  132. vec4 emissiveScaleParam;
  133. vec4 coatParam;
  134. vec4 coatColor;
  135. vec4 flakeParam;
  136. vec4 gradientColor;
  137. };
  138. }%
  139. CCProgram macro-remapping %{
  140. // ui displayed macros
  141. #pragma define-meta HAS_SECOND_UV
  142. #pragma define-meta USE_TWOSIDE
  143. #pragma define-meta USE_VERTEX_COLOR
  144. #pragma define-meta USE_FLAKE
  145. #define CC_SURFACES_USE_SECOND_UV HAS_SECOND_UV
  146. #define CC_SURFACES_USE_TWO_SIDED USE_TWOSIDE
  147. #define CC_SURFACES_USE_VERTEX_COLOR USE_VERTEX_COLOR
  148. #define CC_SURFACES_LIGHTING_CLEAR_COAT 1
  149. // depend on UI macros
  150. #if USE_NORMAL_MAP || USE_FLAKE
  151. #define CC_SURFACES_USE_TANGENT_SPACE 1
  152. #endif
  153. }%
  154. CCProgram surface-vertex %{
  155. #define CC_SURFACES_VERTEX_MODIFY_SHADOW_BIAS
  156. vec2 SurfacesVertexModifyShadowBias(in SurfacesStandardVertexIntermediate In, vec2 originShadowBias)
  157. {
  158. return originShadowBias + vec2(emissiveScaleParam.z, 0.0);
  159. }
  160. #define CC_SURFACES_VERTEX_MODIFY_UV
  161. void SurfacesVertexModifyUV(inout SurfacesStandardVertexIntermediate In)
  162. {
  163. In.texCoord = In.texCoord * tilingOffset.xy + tilingOffset.zw;
  164. #if CC_SURFACES_USE_SECOND_UV
  165. In.texCoord1 = In.texCoord1 * tilingOffset.xy + tilingOffset.zw;
  166. #endif
  167. }
  168. }%
  169. CCProgram surface-fragment %{
  170. #if USE_ALBEDO_MAP
  171. uniform sampler2D albedoMap;
  172. #pragma define-meta ALBEDO_UV options([v_uv, v_uv1])
  173. #endif
  174. #if USE_NORMAL_MAP
  175. uniform sampler2D normalMap;
  176. #pragma define-meta NORMAL_UV options([v_uv, v_uv1])
  177. #endif
  178. #pragma define-meta DEFAULT_UV options([v_uv, v_uv1])
  179. #if USE_PBR_MAP
  180. uniform sampler2D pbrMap;
  181. #endif
  182. #if USE_OCCLUSION_MAP
  183. uniform sampler2D occlusionMap;
  184. #endif
  185. #if USE_FLAKE
  186. uniform sampler2D coatNormalMap;
  187. uniform sampler2D flakeDataMap;
  188. #endif
  189. #if USE_COAT_DATA_MAP
  190. uniform sampler2D coatDataMap;
  191. #endif
  192. #pragma define OCCLUSION_CHANNEL r
  193. #pragma define ROUGHNESS_CHANNEL g
  194. #pragma define METALLIC_CHANNEL b
  195. #pragma define SPECULAR_INTENSITY_CHANNEL a
  196. #if USE_ALPHA_TEST
  197. #pragma define-meta ALPHA_TEST_CHANNEL options([a, r])
  198. #endif
  199. #define CC_SURFACES_FRAGMENT_MODIFY_CLEAR_COAT_PARAMS
  200. vec4 SurfacesFragmentModifyClearCoatParams()
  201. {
  202. vec4 params = vec4(coatParam.x, coatParam.y - 0.99, coatParam.z, coatParam.w * 2.0);
  203. #if USE_COAT_DATA_MAP
  204. vec4 coatData = texture(coatDataMap, FSInput_texcoord);
  205. params *= vec4(coatData.r, 1.0, coatData.b, coatData.g);
  206. #endif
  207. return params;
  208. }
  209. #define CC_SURFACES_FRAGMENT_MODIFY_CLEAR_COAT_COLOR
  210. vec3 SurfacesFragmentModifyClearCoatColor()
  211. {
  212. return coatColor.xyz;
  213. }
  214. #if USE_FLAKE
  215. vec4 sampleFlakeData(vec2 uv)
  216. {
  217. vec4 blurred = texture(flakeDataMap, uv);
  218. vec4 detailed = fragTextureLod(flakeDataMap, uv, 1.0);
  219. return lerp(blurred, detailed, 0.3);
  220. }
  221. vec4 sampleFlakeNormal(vec2 uv)
  222. {
  223. vec4 blurred = texture(coatNormalMap, uv);
  224. vec4 detailed = fragTextureLod(coatNormalMap, uv, 1.0);
  225. return lerp(blurred, detailed, 0.3);
  226. }
  227. #endif
  228. #define CC_SURFACES_FRAGMENT_MODIFY_CLEAR_COAT_WORLD_NORMAL
  229. vec3 SurfacesFragmentModifyClearCoatWorldNormal()
  230. {
  231. vec3 normal = FSInput_worldNormal;
  232. #if USE_FLAKE
  233. float density = flakeParam.x, densityMin = 0.25, flakeTiling = flakeParam.z;
  234. vec2 uv = FSInput_texcoord * flakeTiling;
  235. vec4 data = sampleFlakeData(uv);
  236. vec3 nmmp = (sampleFlakeNormal(uv).xyz - vec3(0.5)) * 2.0;
  237. float C = (data.a - 1.0) / density + 1.0;
  238. float bumpIntensity = saturate(max(densityMin, C));
  239. nmmp = lerp(vec3(0.0, 0.0, 1.0), nmmp, bumpIntensity);
  240. normal = CalculateNormalFromTangentSpace(nmmp, flakeParam.w, normalize(normal.xyz), normalize(FSInput_worldTangent), FSInput_mirrorNormal);
  241. #endif
  242. return normalize(normal);
  243. }
  244. #include <common-functions>
  245. #include <surfaces/data-structures/standard>
  246. #define CC_SURFACES_FRAGMENT_MODIFY_SHARED_DATA
  247. void SurfacesFragmentModifySharedData(inout SurfacesMaterialData surfaceData)
  248. {
  249. #if USE_GRADIENT_COLOR
  250. vec3 viewDir = normalize(cc_cameraPos.xyz - surfaceData.worldPos);
  251. float NoVSat = saturate(dot(surfaceData.worldNormal, viewDir));
  252. surfaceData.baseColor.rgb = lerp(gradientColor, surfaceData.baseColor, pow(NoVSat, emissiveScaleParam.y)).rgb;
  253. #endif
  254. #if USE_FLAKE
  255. float density = flakeParam.x, flakeColorIntensity = flakeParam.y, flakeTiling = flakeParam.z;
  256. vec2 uv = FSInput_texcoord * flakeTiling;
  257. vec4 data = sampleFlakeData(uv);
  258. float C = (data.a - 1.0) / density + 1.0;
  259. float flakeTintWeight = 1.0;
  260. float flakeWeight = saturate(C) * flakeTintWeight * flakeColorIntensity;
  261. // color
  262. vec4 flakeA = vec4(0.972,0.96,0.915,1);
  263. vec4 flakeB = vec4(1.0,0.78,0.344,1);
  264. vec4 flakeColor = lerp(flakeA, flakeB, data.r);
  265. vec4 color = surfaceData.baseColor;
  266. color = lerp(color, flakeColor, flakeWeight);
  267. color = lerp(surfaceData.baseColor, color, surfaceData.metallic);
  268. surfaceData.baseColor = color;
  269. surfaceData.roughness *= lerp(1.0, 0.5, flakeWeight);
  270. #endif
  271. }
  272. }%
  273. CCProgram standard-vs %{
  274. precision highp float;
  275. // 1. surface internal macros, for technique usage or remapping some user (material) macros to surface internal macros
  276. #include <macro-remapping>
  277. #include <surfaces/effect-macros/common-macros>
  278. // 2. common include with corresponding shader stage, include before surface functions
  279. #include <surfaces/includes/common-vs>
  280. // 3. user surface functions that can use user (effect) parameters (ubo Constants)
  281. // see surfaces/default-functions/xxx.chunk
  282. #include <shared-ubos>
  283. #include <surface-vertex>
  284. // 4. surface include with corresponding shader stage and shading-model (optional)
  285. #include <surfaces/includes/standard-vs>
  286. // 5. shader entry with corresponding shader stage and technique usage/type
  287. #include <shading-entries/main-functions/render-to-scene/vs>
  288. }%
  289. CCProgram shadow-caster-vs %{
  290. precision highp float;
  291. #include <macro-remapping>
  292. #include <surfaces/effect-macros/render-to-shadowmap>
  293. #include <surfaces/includes/common-vs>
  294. #include <shared-ubos>
  295. #include <surface-vertex>
  296. #include <shading-entries/main-functions/render-to-shadowmap/vs>
  297. }%
  298. CCProgram planar-shadow-vs %{
  299. precision highp float;
  300. #include <macro-remapping>
  301. #include <surfaces/effect-macros/render-planar-shadow>
  302. #include <surfaces/includes/common-vs>
  303. #include <shared-ubos>
  304. #include <surface-vertex>
  305. #include <shading-entries/main-functions/render-planar-shadow/vs>
  306. }%
  307. CCProgram standard-fs %{
  308. // shading-model : standard
  309. // lighting-model : standard (isotropy / anisotropy pbr)
  310. // shader stage : fs
  311. // technique usage/type : render-to-scene
  312. precision highp float;
  313. // 1. surface internal macros, for technique usage or remapping some user (material) macros to surface internal macros
  314. #include <macro-remapping>
  315. #include <surfaces/effect-macros/common-macros>
  316. // 2. common include with corresponding shader stage, include before surface functions
  317. #include <surfaces/includes/common-fs>
  318. // 3. user surface functions that can use user (effect) parameters (ubo Constants)
  319. // see surfaces/default-functions/xxx.chunk
  320. #include <shared-ubos>
  321. #include <surface-fragment>
  322. // 4. lighting-model (optional)
  323. #include <lighting-models/includes/standard>
  324. // 5. surface include with corresponding shader stage and shading-model (optional)
  325. #include <surfaces/includes/standard-fs>
  326. // 6. shader entry with corresponding shader stage and technique usage/type
  327. #include <shading-entries/main-functions/render-to-scene/fs>
  328. }%
  329. CCProgram shadow-caster-fs %{
  330. precision highp float;
  331. #include <macro-remapping>
  332. #include <surfaces/effect-macros/render-to-shadowmap>
  333. #include <surfaces/includes/common-fs>
  334. #include <shared-ubos>
  335. #include <surface-fragment>
  336. #include <shading-entries/main-functions/render-to-shadowmap/fs>
  337. }%
  338. CCProgram planar-shadow-fs %{
  339. precision highp float;
  340. #include <macro-remapping>
  341. #include <surfaces/effect-macros/render-planar-shadow>
  342. #include <surfaces/includes/common-fs>
  343. #include <shared-ubos>
  344. #include <surface-fragment>
  345. #include <shading-entries/main-functions/render-planar-shadow/fs>
  346. }%
  347. CCProgram reflect-map-fs %{
  348. precision highp float;
  349. #include <macro-remapping>
  350. #include <surfaces/effect-macros/common-macros>
  351. #include <surfaces/includes/common-fs>
  352. #include <shared-ubos>
  353. #include <surface-fragment>
  354. #include <lighting-models/includes/standard>
  355. #include <surfaces/includes/standard-fs>
  356. #include <shading-entries/main-functions/render-to-reflectmap/fs>
  357. }%