forward-fs.chunk 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. layout(location = 0) out vec4 fragColorX;
  2. void main() {
  3. #if CC_DISABLE_STRUCTURE_IN_FRAGMENT_SHADER
  4. float NoL = dot(-cc_mainLitDir.xyz, FSInput_worldNormal.xyz); //trigger ubo binding
  5. vec4 color = SurfacesFragmentModifyBaseColorAndTransparency();
  6. float fogFactor = 1.0;
  7. #if CC_FORWARD_ADD
  8. color.rgb = vec3(0.0);
  9. #endif
  10. #else
  11. // Surface
  12. SurfacesMaterialData surfaceData;
  13. CCSurfacesFragmentGetMaterialData(surfaceData);
  14. // Shadow parameters
  15. vec2 shadowBias = vec2(0.0);
  16. vec3 colDebugCSMLayer = vec3(1.0);
  17. #if CC_RECEIVE_SHADOW
  18. shadowBias = FSInput_shadowBias;
  19. #if !CC_FORWARD_ADD
  20. #if CC_USE_DEBUG_VIEW && CC_SURFACES_ENABLE_DEBUG_VIEW
  21. if (IS_DEBUG_VIEW_MISC_ENABLE_CSM_LAYER_COLORATION)
  22. {
  23. vec4 csmPos;
  24. vec4 shadowProjDepthInfo, shadowProjInfo;
  25. vec3 shadowViewDir0, shadowViewDir1, shadowViewDir2;
  26. int csmLayer = -1;
  27. csmLayer = CCGetCSMLevel(csmPos, shadowProjDepthInfo, shadowProjInfo, shadowViewDir0, shadowViewDir1, shadowViewDir2, surfaceData.worldPos);
  28. bool OutOfRange = csmLayer < 0;
  29. if (OutOfRange)
  30. colDebugCSMLayer = vec3(1.0);
  31. else if (csmLayer == 0)
  32. colDebugCSMLayer = vec3(1.0, 0.0, 0.0);
  33. else if (csmLayer == 1)
  34. colDebugCSMLayer = vec3(0.0, 1.0, 0.0);
  35. else if (csmLayer == 2)
  36. colDebugCSMLayer = vec3(0.0, 0.0, 1.0);
  37. else if (csmLayer == 3)
  38. colDebugCSMLayer = vec3(0.0, 1.0, 1.0);
  39. }
  40. #endif
  41. #endif
  42. #endif
  43. // Fog factor
  44. float fogFactor = 1.0;
  45. #if !CC_FORWARD_ADD
  46. #if CC_USE_FOG != CC_FOG_NONE
  47. #if !CC_USE_ACCURATE_FOG
  48. fogFactor = FSInput_fogFactor;
  49. #else
  50. CC_TRANSFER_FOG_BASE(vec4(FSInput_worldPos, 1.0), fogFactor);
  51. #endif
  52. #endif
  53. #if CC_USE_DEBUG_VIEW == CC_SURFACES_DEBUG_VIEW_COMPOSITE_AND_MISC && CC_SURFACES_ENABLE_DEBUG_VIEW
  54. if (!IS_DEBUG_VIEW_COMPOSITE_ENABLE_FOG) {
  55. fogFactor = 1.0;
  56. }
  57. #endif
  58. #endif
  59. // Lighting
  60. LightingResult lightingResult;
  61. CCSurfacesLighting(lightingResult, surfaceData, shadowBias);
  62. // Debug view
  63. #if CC_USE_DEBUG_VIEW == CC_SURFACES_DEBUG_VIEW_SINGLE && CC_SURFACES_ENABLE_DEBUG_VIEW
  64. vec4 debugColor = vec4(0.0, 0.0, 0.0, 1.0);
  65. float materialTransparency = CCSurfacesShading(surfaceData, lightingResult).a;
  66. #if !CC_FORWARD_ADD && !CC_SURFACES_LIGHTING_DISABLE_DIFFUSE
  67. CCSurfacesDebugViewMeshData(debugColor);
  68. if (CCSurfacesDebugViewSurfaceData(debugColor, surfaceData))
  69. {
  70. debugColor.a = materialTransparency;
  71. }
  72. if (IS_DEBUG_VIEW_SINGLE_MODE(CC_SURFACES_DEBUG_VIEW_FOG))
  73. {
  74. debugColor.rgb = vec3(1.0 - fogFactor);
  75. }
  76. #endif
  77. // only base pass or direct lighting is enabled in add pass
  78. #if CC_FORWARD_ADD
  79. if (IS_DEBUG_VIEW_SINGLE_MODE(CC_SURFACES_DEBUG_VIEW_DIRECT_DIFFUSE) || IS_DEBUG_VIEW_SINGLE_MODE(CC_SURFACES_DEBUG_VIEW_DIRECT_SPECULAR) || IS_DEBUG_VIEW_SINGLE_MODE(CC_SURFACES_DEBUG_VIEW_DIRECT_ALL) ||
  80. IS_DEBUG_VIEW_SINGLE_MODE(CC_SURFACES_DEBUG_VIEW_TRANSMIT_DIRECT_DIFFUSE) || IS_DEBUG_VIEW_SINGLE_MODE(CC_SURFACES_DEBUG_VIEW_TRANSMIT_DIRECT_SPECULAR) || IS_DEBUG_VIEW_SINGLE_MODE(CC_SURFACES_DEBUG_VIEW_DIRECT_2ND_SPECULAR))
  81. #endif
  82. {
  83. if (CCSurfacesDebugViewLightingResult(debugColor, lightingResult))
  84. {
  85. // Use material alpha
  86. debugColor.a = materialTransparency;
  87. // lighting needs color space conversion
  88. #if !CC_USE_FLOAT_OUTPUT
  89. debugColor.rgb = HDRToLDR(debugColor.rgb);
  90. debugColor.rgb = LinearToSRGB(debugColor.rgb);
  91. #endif
  92. }
  93. }
  94. if (IS_DEBUG_VIEW_ENABLE_WITH_CAMERA) {
  95. fragColorX = debugColor;
  96. return;
  97. }
  98. #elif CC_USE_DEBUG_VIEW == CC_SURFACES_DEBUG_VIEW_COMPOSITE_AND_MISC && CC_SURFACES_ENABLE_DEBUG_VIEW
  99. CCSurfacesDebugViewCompositeLightingResult(lightingResult);
  100. #endif
  101. // Shading
  102. vec4 color = CCSurfacesShading(surfaceData, lightingResult);
  103. #if CC_USE_DEBUG_VIEW && CC_SURFACES_ENABLE_DEBUG_VIEW
  104. // CSM Debug
  105. if (IS_DEBUG_VIEW_MISC_ENABLE_CSM_LAYER_COLORATION) {
  106. color.rgb *= colDebugCSMLayer.rgb;
  107. }
  108. // Invalid input data visualization
  109. #if CC_SURFACES_USE_TANGENT_SPACE
  110. color = CCSurfacesDebugDisplayInvalidInputData(color, FSInput_worldTangent);
  111. #endif
  112. #endif
  113. #endif
  114. // Fog, rgbe and gamma output can't apply fog with forward-add pass
  115. // todo: apply fogColorBrightness to linear fogColor for supporting scatter lighting with HDR
  116. #if CC_USE_FOG != CC_FOG_NONE && (!CC_USE_FLOAT_OUTPUT || CC_IS_TRANSPARENCY_PASS)
  117. #if !CC_FORWARD_ADD
  118. #ifdef CC_SURFACES_LIGHTING_MODIFY_FOG
  119. color.rgb = CCSurfacesLightingModifyFog(fogFactor, color.rgb, surfaceData, lightingResult);
  120. #else
  121. CC_APPLY_FOG_BASE(color, fogFactor);
  122. #endif
  123. #endif
  124. #endif
  125. // Color output
  126. #if CC_USE_RGBE_OUTPUT
  127. color = packRGBE(color.rgb); // for reflection-map
  128. #else
  129. color = CCSurfacesDebugDisplayInvalidNumber(color);
  130. #if !CC_USE_FLOAT_OUTPUT || CC_IS_TRANSPARENCY_PASS
  131. color.rgb = HDRToLDR(color.rgb);
  132. color.rgb = LinearToSRGB(color.rgb);
  133. #endif
  134. #endif
  135. fragColorX = color;
  136. }