standard-fs.chunk 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  1. #ifndef CC_SURFACES_FRAGMENT_MODIFY_BASECOLOR_AND_TRANSPARENCY
  2. // depends on CC_SURFACES_FRAGMENT_MODIFY_BASECOLOR_AND_TRANSPARENCY
  3. vec4 SurfacesFragmentModifyBaseColorAndTransparency()
  4. {
  5. return FSInput_vertexColor;
  6. }
  7. #endif
  8. #ifndef CC_SURFACES_FRAGMENT_ALPHA_CLIP_ONLY
  9. // depends on CC_SURFACES_FRAGMENT_ALPHA_CLIP_ONLY
  10. // for base shape without color usage, such as render-to-shadow
  11. void SurfacesFragmentAlphaClipOnly()
  12. {
  13. }
  14. #endif
  15. #ifndef CC_SURFACES_FRAGMENT_MODIFY_WORLD_NORMAL
  16. // depends on CC_SURFACES_FRAGMENT_MODIFY_WORLD_NORMAL
  17. vec3 SurfacesFragmentModifyWorldNormal()
  18. {
  19. return normalize(FSInput_worldNormal);
  20. }
  21. #endif
  22. #ifndef CC_SURFACES_FRAGMENT_MODIFY_WORLD_TANGENT_AND_BINORMAL
  23. // depends on CC_SURFACES_FRAGMENT_MODIFY_WORLD_TANGENT_AND_BINORMAL
  24. void SurfacesFragmentModifyWorldTangentAndBinormal(inout vec3 worldTangent, inout vec3 worldBinormal, vec3 worldNormal)
  25. {
  26. vec3 tangent = normalize(FSInput_worldTangent);
  27. #if CC_SURFACES_USE_TANGENT_SPACE
  28. vec3 binormal = normalize(CalculateBinormal(worldNormal.xyz, tangent, FSInput_mirrorNormal));
  29. tangent = normalize(cross(binormal, worldNormal));
  30. #else
  31. vec3 binormal = vec3(0.0, 0.0, 0.0);
  32. #endif
  33. worldTangent = tangent;
  34. worldBinormal = binormal;
  35. }
  36. #endif
  37. #ifndef CC_SURFACES_FRAGMENT_MODIFY_IOR
  38. // depends on CC_SURFACES_FRAGMENT_MODIFY_IOR
  39. float SurfacesFragmentModifyIOR()
  40. {
  41. return 1.0;
  42. }
  43. #endif
  44. #ifndef CC_SURFACES_FRAGMENT_MODIFY_ANISOTROPY_PARAMS
  45. // depends on CC_SURFACES_FRAGMENT_MODIFY_ANISOTROPY_PARAMS
  46. // isRotation=1.0: shape(0~1), rotation(0~2PI), 0.0, 0.0
  47. // or
  48. // isRotation=0.0: shape(0~1), anisoDir.xyz(-1~1)
  49. vec4 SurfacesFragmentModifyAnisotropyParams(out float isRotation)
  50. {
  51. isRotation = 1.0;
  52. return vec4(1.0, 0.0, 0.0, 0.0);
  53. }
  54. #endif
  55. #ifndef CC_SURFACES_FRAGMENT_MODIFY_EMISSIVE
  56. // depends on CC_SURFACES_FRAGMENT_MODIFY_EMISSIVE
  57. vec3 SurfacesFragmentModifyEmissive()
  58. {
  59. return vec3(0.0, 0.0, 0.0);
  60. }
  61. #endif
  62. #ifndef CC_SURFACES_FRAGMENT_MODIFY_PBRPARAMS
  63. // depends on CC_SURFACES_FRAGMENT_MODIFY_PBRPARAMS
  64. vec4 SurfacesFragmentModifyPBRParams()
  65. {
  66. // ao, roughness, metallic, specularIntensity
  67. return vec4(1.0, 0.5, 0.0, 0.5);
  68. }
  69. #endif
  70. #ifndef CC_SURFACES_FRAGMENT_MODIFY_TRANSMIT_SCATTERING_PARAMS
  71. // depends on CC_SURFACES_FRAGMENT_MODIFY_TRANSMIT_SCATTERING_PARAMS
  72. // scattering related parameters and colors, shared by transmit diffuse and specular
  73. vec4 SurfacesFragmentModifyTransmitScatteringParams()
  74. {
  75. // x: extinction coef for out/in-scattering, 0 means disable scattering, thin object needs larger value such as 100-1000
  76. // y: in-scattering coef (constant phase function)
  77. // z: transmit normal type, default is 1 means using back face normal, 0 means using view-dependent normal, for shapeless materials such as hair
  78. // w: transmit distance, depending on CC_SURFACES_LIGHTING_USE_SHADOWMAP_TRANSMIT macro value:
  79. // macro is 0: affect direct / env transmit lighting, 0 means disable scattering, (water depth, leaf / hair thicknessMap, ear / nose thicknessMap)
  80. // macro is 1: only affect env transmit when shadow dir not match back normal (actual mesh thickness for ear / nose, nephrite)
  81. return vec4(1.0, 1.0, 1.0, 1.0);
  82. }
  83. #endif
  84. #ifndef CC_SURFACES_FRAGMENT_MODIFY_TRANSMIT_IN_SCATTERING_COLOR
  85. // depends on CC_SURFACES_FRAGMENT_MODIFY_TRANSMIT_IN_SCATTERING_COLOR
  86. vec3 SurfacesFragmentModifyTransmitInScatteringColor()
  87. {
  88. // added light multiplier
  89. return vec3(0.0);
  90. }
  91. #endif
  92. #ifndef CC_SURFACES_FRAGMENT_MODIFY_TRANSMIT_OUT_SCATTERING_COLOR
  93. // depends on CC_SURFACES_FRAGMENT_MODIFY_TRANSMIT_OUT_SCATTERING_COLOR
  94. vec3 SurfacesFragmentModifyTransmitOutScatteringColor()
  95. {
  96. // transmit background multiplier
  97. return vec3(1.0);
  98. }
  99. #endif
  100. #ifndef CC_SURFACES_FRAGMENT_MODIFY_TRANSMIT_DIFFUSE_PARAMS
  101. // depends on CC_SURFACES_FRAGMENT_MODIFY_TRANSMIT_DIFFUSE_PARAMS
  102. vec4 SurfacesFragmentModifyTransmitDiffuseParams()
  103. {
  104. // this param valid only when CC_SURFACES_LIGHTING_USE_SHADOWMAP_TRANSMIT is 1
  105. // material should use cull none for shadow caster pass, and enable shadow casting and receive shadow
  106. // x: object (material part) thickness (worldspace unit bounding box max length), apply shadows for backlit only when shadowmap distance > object thickness, 0 means always apply shadows(thin object), SURFACES_MAX_TRANSMIT_DEPTH_VALUE means do not apply shadows.
  107. // notice: setting too small a value for thick objects, no transmit light will disappear.
  108. // y: transmit area mask, limit area to avoid shadowmap coverage precision artifacts, default 1.0 means enable full transmit, and gradient value makes transmit lighting look smoother
  109. // z: environment transmit scale, useless (env transmit is not accuracy, some material should give 0 to disable, or use area mask instead)
  110. // w: shadowmap transmit distance scale, useless (very large model is hard to control transmit lighting through extinction coef, should use small value to scale its distance)
  111. return vec4(1.0, 1.0, 1.0, 1.0);
  112. }
  113. #endif
  114. #ifndef CC_SURFACES_FRAGMENT_MODIFY_TRT_PARAMS
  115. // depends on CC_SURFACES_FRAGMENT_MODIFY_TRT_PARAMS
  116. vec4 SurfacesFragmentModifyTRTParams()
  117. {
  118. //x: roughness offset
  119. //y: lighting rotation offset
  120. //w: intensity
  121. return vec4(0.2, 0.0, 0.0, 1.0);
  122. }
  123. #endif
  124. #ifndef CC_SURFACES_FRAGMENT_MODIFY_TRT_COLOR
  125. // depends on CC_SURFACES_FRAGMENT_MODIFY_TRT_COLOR
  126. vec3 SurfacesFragmentModifyTRTColor()
  127. {
  128. return vec3(1.0, 1.0, 1.0);
  129. }
  130. #endif
  131. #ifndef CC_SURFACES_FRAGMENT_MODIFY_TT_PARAMS
  132. // depends on CC_SURFACES_FRAGMENT_MODIFY_TT_PARAMS
  133. vec4 SurfacesFragmentModifyTTParams()
  134. {
  135. //x: scatter coef
  136. //w: intensity
  137. return vec4(0.0, 0.0, 0.0, 1.0);
  138. }
  139. #endif
  140. #ifndef CC_SURFACES_FRAGMENT_MODIFY_TT_COLOR
  141. // depends on CC_SURFACES_FRAGMENT_MODIFY_TT_COLOR
  142. vec3 SurfacesFragmentModifyTTColor(in vec3 baseColor)
  143. {
  144. // baseColor for reference
  145. return vec3(1.0, 1.0, 1.0);
  146. }
  147. #endif
  148. #ifndef CC_SURFACES_FRAGMENT_MODIFY_SSS_PARAMS
  149. // depends on CC_SURFACES_FRAGMENT_MODIFY_SSS_PARAMS
  150. vec4 SurfacesFragmentModifySSSParams()
  151. {
  152. // x: sssIntensity, moisture
  153. // y: sssCurvature, for preintegrated sss
  154. // z: sssColoration, for sss transmitted light color with dark area
  155. // w: unused
  156. return vec4(1.0, 0.1, 1.0, 0.0);
  157. }
  158. #endif
  159. #ifndef CC_SURFACES_FRAGMENT_MODIFY_DUAL_LOBE_SPECULAR_PARAMS
  160. // depends on CC_SURFACES_FRAGMENT_MODIFY_DUAL_LOBE_SPECULAR_PARAMS
  161. vec4 SurfacesFragmentModifyDualLobeSpecularParams(float roughness)
  162. {
  163. //x: secondary lobe roughness, according to argument (first lobe roughness)
  164. //w: intensity
  165. return vec4(0.2, 0.0, 0.0, 1.0);
  166. }
  167. #endif
  168. #ifndef CC_SURFACES_FRAGMENT_MODIFY_CLEAR_COAT_PARAMS
  169. // depends on CC_SURFACES_FRAGMENT_MODIFY_CLEAR_COAT_PARAMS
  170. vec4 SurfacesFragmentModifyClearCoatParams()
  171. {
  172. //x: coat roughness
  173. //y: coat ior
  174. //z: coat opacity
  175. //w: coat intensity
  176. return vec4(0.2, 1.5, 1.0, 1.0);
  177. }
  178. #endif
  179. #ifndef CC_SURFACES_FRAGMENT_MODIFY_CLEAR_COAT_COLOR
  180. // depends on CC_SURFACES_FRAGMENT_MODIFY_CLEAR_COAT_COLOR
  181. vec3 SurfacesFragmentModifyClearCoatColor()
  182. {
  183. // for iridescense color variation
  184. return vec3(1.0, 1.0, 1.0);
  185. }
  186. #endif
  187. #ifndef CC_SURFACES_FRAGMENT_MODIFY_CLEAR_COAT_WORLD_NORMAL
  188. // depends on CC_SURFACES_FRAGMENT_MODIFY_CLEAR_COAT_WORLD_NORMAL
  189. vec3 SurfacesFragmentModifyClearCoatWorldNormal()
  190. {
  191. return normalize(FSInput_worldNormal);
  192. }
  193. #endif
  194. #ifndef CC_SURFACES_FRAGMENT_MODIFY_SHEEN_PARAMS
  195. // depends on CC_SURFACES_FRAGMENT_MODIFY_SHEEN_PARAMS
  196. vec4 SurfacesFragmentModifySheenParams()
  197. {
  198. //x: sheen roughness
  199. //y: sheen opacity
  200. //z: unused
  201. //w: sheen intensity
  202. return vec4(0.7, 1.0, 1.0, 1.0);
  203. }
  204. #endif
  205. #ifndef CC_SURFACES_FRAGMENT_MODIFY_SHEEN_COLOR
  206. // depends on CC_SURFACES_FRAGMENT_MODIFY_SHEEN_COLOR
  207. vec3 SurfacesFragmentModifySheenColor()
  208. {
  209. return vec3(1.0, 1.0, 1.0);
  210. }
  211. #endif
  212. #ifndef CC_SURFACES_FRAGMENT_MODIFY_SHARED_DATA
  213. // depends on CC_SURFACES_FRAGMENT_MODIFY_SHARED_DATA
  214. // some material datas use shared raw data, avoid sample / calculate same raw data multiply times, use this function for better performance
  215. // this function invokes at last
  216. // should use corresponding shading-model header: #include <surfaces/data-structures/XXX> before function define
  217. void SurfacesFragmentModifySharedData(inout SurfacesMaterialData surfaceData)
  218. {
  219. }
  220. #endif