zeno-fluid-liquid.effect 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440
  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. vatSpeed: { value: 1.0, target: vatAnimParams.x, editor: { displayName: AnimationSpeed } }
  10. vatNormalIntensity: { value: 0.5, target: vatAnimParams.y, editor: { displayName: AnimationNormalIntensity, slide: true, range: [0, 1.0], step: 0.001 } }
  11. vatLoopStartFrame: { value: 0, target: vatBBMin.w, editor: { parent: USE_LOOP_ANIMATION, displayName: UnusedAnimationLoopStartFrame } }
  12. vatLoopEndFrame: { value: 0, target: vatBBMax.w, editor: { parent: USE_LOOP_ANIMATION, displayName: UnusedAnimationLoopEndFrame } }
  13. vatFrameCount: { value: 0.0, target: vatAnimParams.z, editor: { displayName: NumOfFrames } }
  14. vatBoundingBoxMax: { value: [1.0, 1.0, 1.0], target: vatBBMax.xyz, editor: { displayName: BoundingBoxMax } }
  15. vatBoundingBoxMin: { value: [-1.0, -1.0, -1.0], target: vatBBMin.xyz, editor: { displayName: BoundingBoxMin } }
  16. allBlocksBoundingBoxMax: { value: [0.0, 0.0, 0.0], target: allBlocksBBMax.xyz, editor: { parent: USE_EDGE_FADING } }
  17. allBlocksBoundingBoxMin: { value: [1.0, 1.0, 1.0], target: allBlocksBBMin.xyz, editor: { parent: USE_EDGE_FADING } }
  18. ReflectionIntensity: { value: 30.0, target: vatLUTParams.w, editor: { parent: USE_REFRACTION, displayName: ReflectionIntensity } }
  19. IOR: { value: 1.33, target: vatAnimParams.w, editor: { parent: USE_REFRACTION, displayName: IndexOfRefraction } }
  20. mainColor: { value: [1.0, 1.0, 1.0, 1.0], target: albedo, linear: true, editor: { displayName: Albedo, type: color } }
  21. albedoScale: { value: [1.0, 1.0, 1.0], target: albedoScaleAndCutoff.xyz }
  22. alphaThreshold: { value: 0.5, target: albedoScaleAndCutoff.w, editor: { parent: USE_ALPHA_TEST, slide: true, range: [0, 1.0], step: 0.001 } }
  23. roughness: { value: 0.5, target: pbrParams.y, editor: { slide: true, range: [0, 1.0], step: 0.001 } }
  24. metallic: { value: 0.0, target: pbrParams.z, editor: { slide: true, range: [0, 1.0], step: 0.001 } }
  25. specularIntensity: { value: 0.5, target: pbrParams.w, editor: { slide: true, range: [0.0, 1.0], step: 0.001 } }
  26. normalStrength: { value: 1.0, target: emissiveScaleParam.w, editor: { parent: USE_NORMAL_MAP, slide: true, range: [0, 5.0], step: 0.001 } }
  27. normalMap: { value: normal, editor : { parent: USE_NORMAL_MAP } }
  28. normalMapDetailed: { value: normal, editor : { parent: USE_NORMAL_MAP, tooltip: i18n:ENGINE.assets.effect.propertyTips.normalMap } }
  29. baseTiling: { value: 100.0, target: pbrParams.x, editor: { parent: USE_NORMAL_MAP, range: [1.0, 10000.0] } }
  30. waterSpeed: { value: 0.2, target: waterParam.x, editor: { parent: USE_NORMAL_MAP, slide: true, range: [0, 2.0], step: 0.001 } }
  31. detailedSpeed: { value: 0.2, target: waterParam.y, editor: { parent: USE_NORMAL_MAP, slide: true, range: [0, 2.0], step: 0.001 } }
  32. detailedTiling: { value: 0.2, target: waterParam.z, editor: { parent: USE_NORMAL_MAP, slide: true, range: [0, 1.0], step: 0.001 } }
  33. detailedIntensity: { value: 0.5, target: waterParam.w, editor: { parent: USE_NORMAL_MAP, slide: true, range: [0, 1.0], step: 0.001 } }
  34. waterInScatterColor: { value: [0.07, 0.13, 0.087, 1.0], target: waterColor, linear: true, editor: { parent: USE_WATER_SCATTERING, type: color } }
  35. waterScatterCoef: { value: 3.0, target: waterColor.w, editor: { parent: USE_WATER_SCATTERING, range: [0, 10.0] } }
  36. vatPositionMap: { value: grey, target: vatPositionTexture, editor: { displayName: PositionMap } }
  37. vatNormalMap: { value: grey, target: vatNormalTexture }
  38. rasterizerState: &r1
  39. cullMode: none
  40. - &forward-add
  41. vert: standard-vs
  42. frag: standard-fs
  43. phase: forward-add
  44. propertyIndex: 0
  45. embeddedMacros: { CC_FORWARD_ADD: true }
  46. rasterizerState:
  47. cullMode: none
  48. depthStencilState:
  49. depthFunc: equal
  50. depthTest: true
  51. depthWrite: false
  52. blendState:
  53. targets:
  54. - blend: true
  55. blendSrc: one
  56. blendDst: one
  57. blendSrcAlpha: zero
  58. blendDstAlpha: one
  59. - &shadow-caster
  60. vert: shadow-caster-vs
  61. frag: shadow-caster-fs
  62. phase: shadow-caster
  63. propertyIndex: 0
  64. rasterizerState:
  65. cullMode: front
  66. properties:
  67. mainColor: { value: [1.0, 1.0, 1.0, 1.0], target: albedo, editor: { displayName: Albedo, type: color } }
  68. albedoScale: { value: [1.0, 1.0, 1.0], target: albedoScaleAndCutoff.xyz }
  69. alphaThreshold: { value: 0.5, target: albedoScaleAndCutoff.w, editor: { parent: USE_ALPHA_TEST } }
  70. - &reflect-map
  71. vert: standard-vs
  72. frag: reflect-map-fs
  73. phase: reflect-map
  74. propertyIndex: 0
  75. - &deferred-forward
  76. vert: standard-vs
  77. frag: standard-fs
  78. phase: deferred-forward
  79. propertyIndex: 0
  80. rasterizerState: *r1
  81. - name: transparent
  82. passes:
  83. - vert: standard-vs
  84. frag: standard-fs
  85. embeddedMacros: { CC_FORCE_FORWARD_SHADING: true }
  86. depthStencilState: &d1
  87. depthTest: true
  88. depthWrite: false
  89. blendState: &b1
  90. targets:
  91. - blend: true
  92. blendSrc: src_alpha
  93. blendDst: one_minus_src_alpha
  94. blendDstAlpha: one_minus_src_alpha
  95. properties: *props
  96. - *forward-add
  97. - *shadow-caster
  98. - &deferred-forward
  99. vert: standard-vs
  100. frag: standard-fs
  101. phase: deferred-forward
  102. embeddedMacros: { CC_PIPELINE_TYPE: 0 }
  103. depthStencilState: *d1
  104. blendState: *b1
  105. propertyIndex: 0
  106. }%
  107. CCProgram shared-ubos %{
  108. uniform Constants {
  109. vec4 vatAnimParams;
  110. vec4 vatNoLUTParams;
  111. vec4 vatLUTParams;
  112. vec4 vatBBMax;
  113. vec4 vatBBMin;
  114. vec4 allBlocksBBMax;
  115. vec4 allBlocksBBMin;
  116. vec4 albedo;
  117. vec4 albedoScaleAndCutoff;
  118. vec4 pbrParams;
  119. vec4 emissiveScaleParam;
  120. vec4 anisotropyParam;
  121. vec4 waterParam;
  122. vec4 waterColor;
  123. };
  124. }%
  125. CCProgram macro-remapping %{
  126. // ui displayed macros
  127. #pragma define-meta HAS_SECOND_UV
  128. #pragma define-meta USE_TWOSIDE
  129. #pragma define-meta USE_REFRACTION default(true)
  130. #define CC_SURFACES_USE_SECOND_UV HAS_SECOND_UV
  131. #define CC_SURFACES_USE_TWO_SIDED USE_TWOSIDE
  132. #define CC_SURFACES_LIGHTING_USE_FRESNEL USE_REFRACTION
  133. #define CC_SURFACES_LIGHTING_TRANSMIT_SPECULAR USE_REFRACTION
  134. #define CC_SURFACES_TRANSFER_LOCAL_POS 1
  135. // depend on UI macros
  136. #if USE_NORMAL_MAP
  137. #define CC_SURFACES_USE_TANGENT_SPACE 1
  138. #endif
  139. }%
  140. CCProgram surface-vertex %{
  141. #include <common/math/transform>
  142. #include <common/math/number>
  143. #include <common/texture/texture-misc>
  144. #include <common/mesh/vat-animation>
  145. uniform highp sampler2D vatPositionTexture;
  146. uniform highp sampler2D vatNormalTexture;
  147. #define CC_SURFACES_VERTEX_MODIFY_LOCAL_SHARED_DATA
  148. void SurfacesVertexModifyLocalSharedData(inout SurfacesStandardVertexIntermediate In)
  149. {
  150. vec2 originUV = In.texCoord, thisFrameUV, nextFrameUV;
  151. #if CC_SURFACES_USE_SECOND_UV
  152. originUV = In.texCoord1;
  153. #endif
  154. float numOfFrames = vatAnimParams.z, speed = vatAnimParams.x;
  155. //todo: zeno obj models need inverse V
  156. originUV.y = 1.0 - originUV.y;
  157. float frameLerp = VATGetAnimUV(thisFrameUV, nextFrameUV, originUV, numOfFrames, speed, cc_time.x);
  158. // pos is normalized 0-1 from texture and expanding to bounding box range
  159. vec3 posNormalized = SampleTextureExr(vatPositionTexture, thisFrameUV);
  160. In.position.xyz = posNormalized * (vatBBMax.xyz - vatBBMin.xyz) + vatBBMin.xyz;
  161. vec3 normal = texture(vatNormalTexture, thisFrameUV).rgb * 2.0 - 1.0;
  162. In.normal.xyz = normalize(normal);
  163. }
  164. #define CC_SURFACES_VERTEX_MODIFY_UV
  165. void SurfacesVertexModifyUV(inout SurfacesStandardVertexIntermediate In)
  166. {
  167. #if USE_EDGE_FADING
  168. // calculated in local space
  169. vec3 allBBSize = allBlocksBBMax.xyz - allBlocksBBMin.xyz;
  170. vec3 voxelUV = (In.position.xyz - allBlocksBBMin.xyz) / allBBSize;
  171. In.texCoord = voxelUV.xz;
  172. #endif
  173. }
  174. }%
  175. CCProgram surface-fragment %{
  176. #include <common/mesh/vat-animation>
  177. #if USE_NORMAL_MAP
  178. uniform sampler2D normalMap;
  179. uniform sampler2D normalMapDetailed;
  180. #pragma define-meta NORMAL_UV options([v_uv, v_uv1])
  181. #endif
  182. #pragma define-meta DEFAULT_UV options([v_uv, v_uv1])
  183. #pragma define OCCLUSION_CHANNEL r
  184. #pragma define ROUGHNESS_CHANNEL g
  185. #pragma define METALLIC_CHANNEL b
  186. #pragma define SPECULAR_INTENSITY_CHANNEL a
  187. #if USE_ALPHA_TEST
  188. #pragma define-meta ALPHA_TEST_CHANNEL options([a, r])
  189. #endif
  190. ////////////////////////////////////////////////////////////////water material
  191. #include <common/effect/special-effects>
  192. vec3 GetDetailedNormal(vec2 texCoord, float tiling, sampler2D normalMap, sampler2D normalMapDetailed, vec3 N, vec3 T)
  193. {
  194. float waterSpeed = waterParam.x;
  195. float detailedSpeed = waterParam.y;
  196. float detailedTiling = waterParam.z * tiling;
  197. float detailedIntensity = waterParam.w;
  198. float normalIntensity = emissiveScaleParam.w;
  199. vec2 uv = texCoord * tiling + vec2(cc_time.w, cc_time.w) * waterSpeed;
  200. vec3 nmmp = texture(normalMap, uv).xyz - vec3(0.5);
  201. vec2 uvDetailed = texCoord * detailedTiling + vec2(0.0, cc_time.w) * detailedSpeed;
  202. vec3 nmmpDetailed = texture(normalMapDetailed, uvDetailed).xyz - vec3(0.5);
  203. // normal blending
  204. nmmp = BlendDetailedNormalMap(nmmp, nmmpDetailed, detailedIntensity);
  205. return normalize(CalculateNormalFromTangentSpace(nmmp, normalIntensity, N, T, FSInput_mirrorNormal));
  206. }
  207. vec3 GetFresnel(vec3 fresnel)
  208. {
  209. return saturate(fresnel * 1.5);
  210. }
  211. float GetVATEdgeFadeCoef()
  212. {
  213. float opacity = 1.0;
  214. vec3 coef = vec3(FSInput_texcoord.x, 0.0, FSInput_texcoord.y);
  215. if(coef.z < 0.3)
  216. opacity *= coef.z / 0.3;
  217. if(coef.z > 0.95)
  218. opacity *= (1.0 - coef.z) / (1.0-0.95);
  219. float edge = 0.2;
  220. if(coef.x < edge)
  221. opacity *= coef.x / edge;
  222. if(coef.x > (1.0 - edge))
  223. opacity *= (1.0 - coef.x) / edge;
  224. return opacity;
  225. }
  226. #define CC_SURFACES_FRAGMENT_MODIFY_WORLD_NORMAL
  227. vec3 SurfacesFragmentModifyWorldNormal()
  228. {
  229. vec3 normal = FSInput_worldNormal;
  230. #if USE_NORMAL_MAP
  231. #if USE_EDGE_FADING
  232. vec3 normalFadeTo = GetDetailedNormal(NORMAL_UV, 2.0, normalMap, normalMapDetailed, vec3(0.0, 1.0, 0.0), vec3(1.0, 0.0, 0.0));
  233. float fade = GetVATEdgeFadeCoef();
  234. normal = mix(normalFadeTo, normal, fade);
  235. #endif
  236. #endif
  237. return normalize(normal);
  238. }
  239. #define CC_SURFACES_FRAGMENT_MODIFY_IOR
  240. float SurfacesFragmentModifyIOR()
  241. {
  242. return vatAnimParams.w;
  243. }
  244. #define CC_SURFACES_FRAGMENT_MODIFY_TRANSMIT_SCATTERING_PARAMS
  245. vec4 SurfacesFragmentModifyTransmitScatteringParams()
  246. {
  247. #if USE_WATER_SCATTERING
  248. float depth = 1.0;
  249. return vec4(waterColor.w, 1.0, 1.0, depth);
  250. #else
  251. return vec4(0.0, 0.0, 0.0, 0.0);
  252. #endif
  253. }
  254. #define CC_SURFACES_FRAGMENT_MODIFY_TRANSMIT_IN_SCATTERING_COLOR
  255. vec3 SurfacesFragmentModifyTransmitInScatteringColor()
  256. {
  257. return waterColor.rgb;
  258. }
  259. #define CC_SURFACES_FRAGMENT_MODIFY_PBRPARAMS
  260. vec4 SurfacesFragmentModifyPBRParams()
  261. {
  262. vec4 pbr = pbrParams;
  263. pbr.x = 1.0;
  264. return pbr;
  265. }
  266. #define CC_SURFACES_FRAGMENT_MODIFY_BASECOLOR_AND_TRANSPARENCY
  267. vec4 SurfacesFragmentModifyBaseColorAndTransparency()
  268. {
  269. vec4 baseColor = albedo;
  270. #if USE_VERTEX_COLOR
  271. baseColor.rgb *= SRGBToLinear(FSInput_vertexColor.rgb); // use linear
  272. baseColor.a *= FSInput_vertexColor.a;
  273. #endif
  274. #if USE_ALPHA_TEST
  275. if (baseColor.ALPHA_TEST_CHANNEL < albedoScaleAndCutoff.w) discard;
  276. #endif
  277. baseColor.rgb *= albedoScaleAndCutoff.xyz;
  278. return baseColor;
  279. }
  280. #define CC_SURFACES_FRAGMENT_ALPHA_CLIP_ONLY
  281. void SurfacesFragmentAlphaClipOnly()
  282. {
  283. #if USE_ALPHA_TEST
  284. float alpha = albedo.ALPHA_TEST_CHANNEL;
  285. #if USE_VERTEX_COLOR
  286. alpha *= FSInput_vertexColor.a;
  287. #endif
  288. if (alpha < albedoScaleAndCutoff.w) discard;
  289. #endif
  290. }
  291. #include <surfaces/data-structures/standard>
  292. #define CC_SURFACES_FRAGMENT_MODIFY_SHARED_DATA
  293. void SurfacesFragmentModifySharedData(inout SurfacesMaterialData surfaceData)
  294. {
  295. #if USE_EDGE_FADING && CC_SURFACES_TRANSFER_LOCAL_POS
  296. surfaceData.baseColor.a = GetVATEdgeFadeCoef();
  297. #endif
  298. }
  299. #include <lighting-models/includes/common>
  300. #define CC_SURFACES_LIGHTING_MODIFY_FINAL_RESULT
  301. void SurfacesLightingModifyFinalResult(inout LightingResult result, in LightingIntermediateData lightingData, in SurfacesMaterialData surfaceData, in LightingMiscData miscData)
  302. {
  303. // enhanced reflection for waves
  304. #if USE_REFRACTION
  305. float curve = saturate(surfaceData.worldNormal.y);
  306. float multiplier = 1.0 + pow(1.0 - curve, 0.3) * vatLUTParams.w;
  307. result.environmentSpecular *= multiplier;
  308. #endif
  309. #if CC_SURFACES_LIGHTING_USE_FRESNEL
  310. result.fresnel = GetFresnel(result.fresnel);
  311. #endif
  312. }
  313. }%
  314. CCProgram standard-vs %{
  315. precision highp float;
  316. // 1. surface internal macros, for technique usage or remapping some user (material) macros to surface internal macros
  317. #include <macro-remapping>
  318. #include <surfaces/effect-macros/common-macros>
  319. // 2. common include with corresponding shader stage, include before surface functions
  320. #include <surfaces/includes/common-vs>
  321. // 3. user surface functions that can use user (effect) parameters (ubo Constants)
  322. // see surfaces/default-functions/xxx.chunk
  323. #include <shared-ubos>
  324. #include <surface-vertex>
  325. // 4. surface include with corresponding shader stage and shading-model (optional)
  326. #include <surfaces/includes/standard-vs>
  327. // 5. shader entry with corresponding shader stage and technique usage/type
  328. #include <shading-entries/main-functions/render-to-scene/vs>
  329. }%
  330. CCProgram shadow-caster-vs %{
  331. precision highp float;
  332. #include <macro-remapping>
  333. #include <surfaces/effect-macros/render-to-shadowmap>
  334. #include <surfaces/includes/common-vs>
  335. #include <shared-ubos>
  336. #include <surface-vertex>
  337. #include <shading-entries/main-functions/render-to-shadowmap/vs>
  338. }%
  339. CCProgram standard-fs %{
  340. // shading-model : standard
  341. // lighting-model : standard (isotropy / anisotropy pbr)
  342. // shader stage : fs
  343. // technique usage/type : render-to-scene
  344. precision highp float;
  345. // 1. surface internal macros, for technique usage or remapping some user (material) macros to surface internal macros
  346. #include <macro-remapping>
  347. #include <surfaces/effect-macros/common-macros>
  348. // 2. common include with corresponding shader stage, include before surface functions
  349. #include <surfaces/includes/common-fs>
  350. // 3. user surface functions that can use user (effect) parameters (ubo Constants)
  351. // see surfaces/default-functions/xxx.chunk
  352. #include <shared-ubos>
  353. #include <surface-fragment>
  354. // 4. lighting-model (optional)
  355. #include <lighting-models/includes/standard>
  356. // 5. surface include with corresponding shader stage and shading-model (optional)
  357. #include <surfaces/includes/standard-fs>
  358. // 6. shader entry with corresponding shader stage and technique usage/type
  359. #include <shading-entries/main-functions/render-to-scene/fs>
  360. }%
  361. CCProgram shadow-caster-fs %{
  362. precision highp float;
  363. #include <macro-remapping>
  364. #include <surfaces/effect-macros/render-to-shadowmap>
  365. #include <surfaces/includes/common-fs>
  366. #include <shared-ubos>
  367. #include <surface-fragment>
  368. #include <shading-entries/main-functions/render-to-shadowmap/fs>
  369. }%
  370. CCProgram reflect-map-fs %{
  371. precision highp float;
  372. #include <macro-remapping>
  373. #include <surfaces/effect-macros/common-macros>
  374. #include <surfaces/includes/common-fs>
  375. #include <shared-ubos>
  376. #include <surface-fragment>
  377. #include <lighting-models/includes/standard>
  378. #include <surfaces/includes/standard-fs>
  379. #include <shading-entries/main-functions/render-to-reflectmap/fs>
  380. }%