assign-material-color.glsl.ts 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. export const assign_material_color = `
  2. #if defined(dNeedsMarker)
  3. float marker = uMarker;
  4. if (uMarker == -1.0) {
  5. marker = floor(vMarker * 255.0 + 0.5); // rounding required to work on some cards on win
  6. }
  7. #endif
  8. #if defined(dRenderVariant_color)
  9. #if defined(dUsePalette)
  10. vec4 material = vec4(texture2D(tPalette, vec2(vPaletteV, 0.5)).rgb, uAlpha);
  11. #elif defined(dColorType_uniform)
  12. vec4 material = vec4(uColor, uAlpha);
  13. #elif defined(dColorType_varying)
  14. vec4 material = vec4(vColor.rgb, uAlpha);
  15. #endif
  16. // mix material with overpaint
  17. #if defined(dOverpaint)
  18. material.rgb = mix(material.rgb, vOverpaint.rgb, vOverpaint.a);
  19. #endif
  20. float metalness = uMetalness;
  21. float roughness = uRoughness;
  22. float bumpiness = uBumpiness;
  23. #ifdef dSubstance
  24. metalness = mix(metalness, vSubstance.r, vSubstance.a);
  25. roughness = mix(roughness, vSubstance.g, vSubstance.a);
  26. bumpiness = mix(bumpiness, vSubstance.b, vSubstance.a);
  27. #endif
  28. #elif defined(dRenderVariant_depth)
  29. if (fragmentDepth > getDepth(gl_FragCoord.xy / uDrawingBufferSize)) {
  30. discard;
  31. }
  32. #ifndef dXrayShaded
  33. #if defined(dTransparency)
  34. float dta = 1.0 - vTransparency;
  35. if (vTransparency < 0.2) dta = 1.0; // hard cutoff looks better
  36. if (uRenderMask == MaskTransparent && uAlpha * dta == 1.0) {
  37. discard;
  38. } else if (uRenderMask == MaskOpaque && uAlpha * dta < 1.0) {
  39. discard;
  40. }
  41. #else
  42. if (uRenderMask == MaskTransparent && uAlpha == 1.0) {
  43. discard;
  44. } else if (uRenderMask == MaskOpaque && uAlpha < 1.0) {
  45. discard;
  46. }
  47. #endif
  48. #else
  49. if (uRenderMask == MaskOpaque) {
  50. discard;
  51. }
  52. #endif
  53. vec4 material = packDepthToRGBA(fragmentDepth);
  54. #elif defined(dRenderVariant_marking)
  55. vec4 material;
  56. if(uMarkingType == 1) {
  57. if (marker > 0.0)
  58. discard;
  59. #ifdef enabledFragDepth
  60. material = packDepthToRGBA(gl_FragDepthEXT);
  61. #else
  62. material = packDepthToRGBA(gl_FragCoord.z);
  63. #endif
  64. } else {
  65. if (marker == 0.0)
  66. discard;
  67. float depthTest = 1.0;
  68. if (uMarkingDepthTest) {
  69. depthTest = (fragmentDepth >= getDepthPacked(gl_FragCoord.xy / uDrawingBufferSize)) ? 1.0 : 0.0;
  70. }
  71. bool isHighlight = intMod(marker, 2.0) > 0.1;
  72. float viewZ = depthToViewZ(uIsOrtho, fragmentDepth, uNear, uFar);
  73. float fogFactor = smoothstep(uFogNear, uFogFar, abs(viewZ));
  74. if (fogFactor == 1.0)
  75. discard;
  76. material = vec4(0.0, depthTest, isHighlight ? 1.0 : 0.0, 1.0 - fogFactor);
  77. }
  78. #endif
  79. // apply per-group transparency
  80. #if defined(dTransparency) && (defined(dRenderVariant_pick) || defined(dRenderVariant_color))
  81. float ta = 1.0 - vTransparency;
  82. if (vTransparency < 0.09) ta = 1.0; // hard cutoff looks better
  83. #if defined(dRenderVariant_pick)
  84. if (ta < uPickingAlphaThreshold)
  85. discard; // ignore so the element below can be picked
  86. #elif defined(dRenderVariant_color)
  87. material.a *= ta;
  88. #if defined(dRenderVariant_colorBlended)
  89. #if defined(dTransparentBackfaces_off)
  90. if ((uRenderMask == MaskOpaque && material.a < 1.0) ||
  91. (uRenderMask == MaskTransparent && material.a == 1.0) ||
  92. (interior && material.a < 1.0)
  93. ) {
  94. discard;
  95. }
  96. #elif defined(dTransparentBackfaces_on)
  97. if ((uRenderMask == MaskOpaque && material.a < 1.0) ||
  98. (uRenderMask == MaskTransparent && material.a == 1.0)
  99. ) {
  100. discard;
  101. }
  102. #elif defined(dTransparentBackfaces_opaque)
  103. if (interior) {
  104. material.a = 1.0;
  105. } else if (
  106. (uRenderMask == MaskOpaque && material.a < 1.0) ||
  107. (uRenderMask == MaskTransparent && material.a == 1.0)
  108. ) {
  109. discard;
  110. }
  111. #endif
  112. #endif
  113. #endif
  114. #endif
  115. `;