water.effect 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314
  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. mainColor: { value: [1.0, 1.0, 1.0, 1.0], target: albedo, linear: true, editor: { displayName: Albedo, type: color } }
  10. normalStrength: { value: 1.0, target: pbrParams.w, editor: { parent: USE_NORMAL_MAP, slide: true, range: [0, 5.0], step: 0.001 } }
  11. mainTexture: { value: grey, target: albedoMap, editor: { displayName: AlbedoMap } }
  12. roughness: { value: 0.5, target: pbrParams.y, editor: { slide: true, range: [0, 1.0], step: 0.001 } }
  13. fresnelIntensity: { value: 1.5, target: pbrParams.z, editor: { slide: true, range: [0, 3.0], step: 0.001 } }
  14. normalMap: { value: normal, editor : { parent: USE_NORMAL_MAP } }
  15. normalMapDetailed: { value: normal, editor : { parent: USE_NORMAL_MAP, tooltip: i18n:ENGINE.assets.effect.propertyTips.normalMap } }
  16. baseTiling: { value: 100.0, target: pbrParams.x, editor: { parent: USE_NORMAL_MAP, range: [1.0, 10000.0] } }
  17. waterSpeed: { value: 0.2, target: waterParam.x, editor: { parent: USE_NORMAL_MAP, slide: true, range: [0, 3.0], step: 0.001 } }
  18. detailedSpeed: { value: 0.2, target: waterParam.y, editor: { parent: USE_NORMAL_MAP, slide: true, range: [0, 3.0], step: 0.001 } }
  19. detailedTiling: { value: 0.2, target: waterParam.z, editor: { parent: USE_NORMAL_MAP, slide: true, range: [0, 1.0], step: 0.001 } }
  20. detailedIntensity: { value: 0.5, target: waterParam.w, editor: { parent: USE_NORMAL_MAP, slide: true, range: [0, 1.0], step: 0.001 } }
  21. waterInScatterColor: { value: [0.07, 0.13, 0.087, 1.0], target: waterColor, linear: true, editor: { parent: USE_WATER_SCATTERING, type: color } }
  22. waterScatterCoef: { value: 3.0, target: waterColor.w, editor: { parent: USE_WATER_SCATTERING, range: [0, 10.0], tooltip: 'The higher the value, the more turbid or deeper the water is.' } }
  23. rasterizerState: &r1
  24. cullMode: none
  25. - &forward-add
  26. vert: standard-vs
  27. frag: standard-fs
  28. phase: forward-add
  29. propertyIndex: 0
  30. embeddedMacros: { CC_FORWARD_ADD: true }
  31. rasterizerState:
  32. cullMode: none
  33. depthStencilState:
  34. depthFunc: equal
  35. depthTest: true
  36. depthWrite: false
  37. blendState:
  38. targets:
  39. - blend: true
  40. blendSrc: one
  41. blendDst: one
  42. blendSrcAlpha: zero
  43. blendDstAlpha: one
  44. - &shadow-caster
  45. vert: shadow-caster-vs
  46. frag: shadow-caster-fs
  47. phase: shadow-caster
  48. propertyIndex: 0
  49. rasterizerState:
  50. cullMode: front
  51. properties:
  52. mainColor: { value: [1.0, 1.0, 1.0, 1.0], target: albedo, editor: { displayName: Albedo, type: color } }
  53. mainTexture: { value: grey, target: albedoMap, editor: { displayName: AlbedoMap } }
  54. - &reflect-map
  55. vert: standard-vs
  56. frag: reflect-map-fs
  57. phase: reflect-map
  58. propertyIndex: 0
  59. - &deferred-forward
  60. vert: standard-vs
  61. frag: standard-fs
  62. phase: deferred-forward
  63. propertyIndex: 0
  64. rasterizerState: *r1
  65. - name: transparent
  66. passes:
  67. - vert: standard-vs
  68. frag: standard-fs
  69. embeddedMacros: { CC_FORCE_FORWARD_SHADING: true }
  70. depthStencilState: &d1
  71. depthTest: true
  72. depthWrite: false
  73. blendState: &b1
  74. targets:
  75. - blend: true
  76. blendSrc: src_alpha
  77. blendDst: one_minus_src_alpha
  78. blendDstAlpha: one_minus_src_alpha
  79. properties: *props
  80. - *forward-add
  81. - *shadow-caster
  82. - &deferred-forward-transparent
  83. vert: standard-vs
  84. frag: standard-fs
  85. embeddedMacros: { CC_PIPELINE_TYPE: 0 }
  86. phase: deferred-forward
  87. depthStencilState: *d1
  88. blendState: *b1
  89. propertyIndex: 0
  90. }%
  91. CCProgram shared-ubos %{
  92. uniform Constants {
  93. vec4 albedo;
  94. vec4 pbrParams;
  95. vec4 waterParam;
  96. vec4 waterColor;
  97. };
  98. }%
  99. CCProgram macro-remapping %{
  100. // ui displayed macros
  101. #pragma define-meta HAS_SECOND_UV
  102. #pragma define-meta USE_TWOSIDE editor({ tooltip: i18n:ENGINE.assets.effect.propertyTips.USE_TWOSIDE })
  103. #define CC_SURFACES_USE_SECOND_UV HAS_SECOND_UV
  104. #define CC_SURFACES_USE_TWO_SIDED USE_TWOSIDE
  105. #define CC_SURFACES_LIGHTING_USE_FRESNEL 1
  106. #define CC_SURFACES_LIGHTING_TRANSMIT_SPECULAR 1
  107. // depend on UI macros
  108. #if USE_NORMAL_MAP
  109. #define CC_SURFACES_USE_TANGENT_SPACE 1
  110. #endif
  111. }%
  112. CCProgram surface-vertex %{
  113. }%
  114. CCProgram surface-fragment %{
  115. #if USE_ALBEDO_MAP
  116. uniform sampler2D albedoMap;
  117. #pragma define-meta ALBEDO_UV options([v_uv, v_uv1])
  118. #endif
  119. #if USE_NORMAL_MAP
  120. uniform sampler2D normalMap;
  121. uniform sampler2D normalMapDetailed;
  122. #pragma define-meta NORMAL_UV options([v_uv, v_uv1])
  123. #endif
  124. #pragma define-meta DEFAULT_UV options([v_uv, v_uv1])
  125. #define CC_SURFACES_FRAGMENT_MODIFY_BASECOLOR_AND_TRANSPARENCY
  126. vec4 SurfacesFragmentModifyBaseColorAndTransparency()
  127. {
  128. vec4 baseColor = albedo;
  129. #if USE_VERTEX_COLOR
  130. baseColor.rgb *= SRGBToLinear(FSInput_vertexColor.rgb); // use linear
  131. baseColor.a *= FSInput_vertexColor.a;
  132. #endif
  133. #if USE_ALBEDO_MAP
  134. vec4 texColor = texture(albedoMap, ALBEDO_UV);
  135. texColor.rgb = SRGBToLinear(texColor.rgb);
  136. baseColor *= texColor;
  137. #endif
  138. return baseColor;
  139. }
  140. #define CC_SURFACES_FRAGMENT_ALPHA_CLIP_ONLY
  141. void SurfacesFragmentAlphaClipOnly()
  142. {
  143. }
  144. #include <common/effect/special-effects>
  145. vec3 GetDetailedNormal(vec2 texCoord, float tiling, sampler2D normalMap, sampler2D normalMapDetailed, vec3 N, vec3 T)
  146. {
  147. float waterSpeed = waterParam.x;
  148. float detailedSpeed = waterParam.y;
  149. float detailedTiling = waterParam.z * tiling;
  150. float detailedIntensity = waterParam.w;
  151. float normalIntensity = pbrParams.w;
  152. vec2 uv = texCoord * tiling + vec2(cc_time.w, cc_time.w) * waterSpeed;
  153. vec3 nmmp = texture(normalMap, uv).xyz - vec3(0.5);
  154. vec2 uvDetailed = texCoord * detailedTiling + vec2(0.0, cc_time.w) * detailedSpeed;
  155. vec3 nmmpDetailed = texture(normalMapDetailed, uvDetailed).xyz - vec3(0.5);
  156. // normal blending
  157. nmmp = BlendDetailedNormalMap(nmmp, nmmpDetailed, detailedIntensity);
  158. return normalize(CalculateNormalFromTangentSpace(nmmp, normalIntensity, N, T, FSInput_mirrorNormal));
  159. }
  160. #define CC_SURFACES_FRAGMENT_MODIFY_WORLD_NORMAL
  161. vec3 SurfacesFragmentModifyWorldNormal()
  162. {
  163. vec3 normal = FSInput_worldNormal;
  164. #if USE_NORMAL_MAP
  165. normal = GetDetailedNormal(NORMAL_UV, pbrParams.x, normalMap, normalMapDetailed, normalize(normal), normalize(FSInput_worldTangent));
  166. #endif
  167. return normalize(normal);
  168. }
  169. #define CC_SURFACES_FRAGMENT_MODIFY_IOR
  170. float SurfacesFragmentModifyIOR()
  171. {
  172. return 1.33;
  173. }
  174. #define CC_SURFACES_FRAGMENT_MODIFY_TRANSMIT_SCATTERING_PARAMS
  175. vec4 SurfacesFragmentModifyTransmitScatteringParams()
  176. {
  177. #if USE_WATER_SCATTERING
  178. float depth = max(abs(FSInput_texcoord.x - 0.5), abs(FSInput_texcoord.y - 0.5)) * 2.0;
  179. depth = saturate(1.0 - depth);
  180. return vec4(waterColor.w, 1.0, 1.0, depth);
  181. #else
  182. return vec4(0.0, 0.0, 0.0, 0.0);
  183. #endif
  184. }
  185. #define CC_SURFACES_FRAGMENT_MODIFY_TRANSMIT_IN_SCATTERING_COLOR
  186. vec3 SurfacesFragmentModifyTransmitInScatteringColor()
  187. {
  188. return waterColor.rgb;
  189. }
  190. #include <surfaces/data-structures/standard>
  191. #include <lighting-models/includes/common>
  192. #define CC_SURFACES_LIGHTING_MODIFY_FINAL_RESULT
  193. void SurfacesLightingModifyFinalResult(inout LightingResult result, in LightingIntermediateData lightingData, in SurfacesMaterialData surfaceData, in LightingMiscData miscData)
  194. {
  195. #if CC_SURFACES_LIGHTING_USE_FRESNEL
  196. result.fresnel = saturate(result.fresnel * pbrParams.z);
  197. #endif
  198. }
  199. #define CC_SURFACES_FRAGMENT_MODIFY_PBRPARAMS
  200. vec4 SurfacesFragmentModifyPBRParams()
  201. {
  202. // ao, roughness, metallic, specularIntensity
  203. return vec4(1.0, pbrParams.y, 1.0, 0.5);
  204. }
  205. }%
  206. CCProgram standard-vs %{
  207. precision highp float;
  208. // 1. surface internal macros, for technique usage or remapping some user (material) macros to surface internal macros
  209. #include <macro-remapping>
  210. #include <surfaces/effect-macros/common-macros>
  211. // 2. common include with corresponding shader stage, include before surface functions
  212. #include <surfaces/includes/common-vs>
  213. // 3. user surface functions that can use user (effect) parameters (ubo Constants)
  214. // see surfaces/default-functions/xxx.chunk
  215. #include <shared-ubos>
  216. #include <surface-vertex>
  217. // 4. surface include with corresponding shader stage and shading-model (optional)
  218. #include <surfaces/includes/standard-vs>
  219. // 5. shader entry with corresponding shader stage and technique usage/type
  220. #include <shading-entries/main-functions/render-to-scene/vs>
  221. }%
  222. CCProgram shadow-caster-vs %{
  223. precision highp float;
  224. #include <macro-remapping>
  225. #include <surfaces/effect-macros/render-to-shadowmap>
  226. #include <surfaces/includes/common-vs>
  227. #include <shared-ubos>
  228. #include <surface-vertex>
  229. #include <shading-entries/main-functions/render-to-shadowmap/vs>
  230. }%
  231. CCProgram standard-fs %{
  232. // shading-model : standard
  233. // lighting-model : standard (isotropy / anisotropy pbr)
  234. // shader stage : fs
  235. // technique usage/type : render-to-scene
  236. precision highp float;
  237. // 1. surface internal macros, for technique usage or remapping some user (material) macros to surface internal macros
  238. #include <macro-remapping>
  239. #include <surfaces/effect-macros/common-macros>
  240. // 2. common include with corresponding shader stage, include before surface functions
  241. #include <surfaces/includes/common-fs>
  242. // 3. user surface functions that can use user (effect) parameters (ubo Constants)
  243. // see surfaces/default-functions/xxx.chunk
  244. #include <shared-ubos>
  245. #include <surface-fragment>
  246. // 4. lighting-model (optional)
  247. #include <lighting-models/includes/standard>
  248. // 5. surface include with corresponding shader stage and shading-model (optional)
  249. #include <surfaces/includes/standard-fs>
  250. // 6. shader entry with corresponding shader stage and technique usage/type
  251. #include <shading-entries/main-functions/render-to-scene/fs>
  252. }%
  253. CCProgram shadow-caster-fs %{
  254. precision highp float;
  255. #include <macro-remapping>
  256. #include <surfaces/effect-macros/render-to-shadowmap>
  257. #include <surfaces/includes/common-fs>
  258. #include <shared-ubos>
  259. #include <surface-fragment>
  260. #include <shading-entries/main-functions/render-to-shadowmap/fs>
  261. }%
  262. CCProgram reflect-map-fs %{
  263. precision highp float;
  264. #include <macro-remapping>
  265. #include <surfaces/effect-macros/common-macros>
  266. #include <surfaces/includes/common-fs>
  267. #include <shared-ubos>
  268. #include <surface-fragment>
  269. #include <lighting-models/includes/standard>
  270. #include <surfaces/includes/standard-fs>
  271. #include <shading-entries/main-functions/render-to-reflectmap/fs>
  272. }%