assign-material-color.glsl.ts 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. export const assign_material_color = `
  2. #if defined(dRenderVariant_color) || defined(dRenderVariant_marking)
  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_pick)
  29. vec4 material = vColor;
  30. #elif defined(dRenderVariant_depth)
  31. #ifdef enabledFragDepth
  32. vec4 material = packDepthToRGBA(gl_FragDepthEXT);
  33. #else
  34. vec4 material = packDepthToRGBA(gl_FragCoord.z);
  35. #endif
  36. #elif defined(dRenderVariant_marking)
  37. vec4 material;
  38. if(uMarkingType == 1) {
  39. if (marker > 0.0)
  40. discard;
  41. #ifdef enabledFragDepth
  42. material = packDepthToRGBA(gl_FragDepthEXT);
  43. #else
  44. material = packDepthToRGBA(gl_FragCoord.z);
  45. #endif
  46. } else {
  47. if (marker == 0.0)
  48. discard;
  49. float depthTest = 1.0;
  50. if (uMarkingDepthTest) {
  51. depthTest = (fragmentDepth >= getDepth(gl_FragCoord.xy / uDrawingBufferSize)) ? 1.0 : 0.0;
  52. }
  53. bool isHighlight = intMod(marker, 2.0) > 0.1;
  54. float viewZ = depthToViewZ(uIsOrtho, fragmentDepth, uNear, uFar);
  55. float fogFactor = smoothstep(uFogNear, uFogFar, abs(viewZ));
  56. if (fogFactor == 1.0)
  57. discard;
  58. material = vec4(0.0, depthTest, isHighlight ? 1.0 : 0.0, 1.0 - fogFactor);
  59. }
  60. #endif
  61. // apply screendoor transparency
  62. #if defined(dTransparency)
  63. float ta = 1.0 - vTransparency;
  64. #if defined(dRenderVariant_colorWboit)
  65. if (vTransparency < 0.2) ta = 1.0; // hard cutoff looks better with wboit
  66. #endif
  67. #if defined(dRenderVariant_pick)
  68. if (ta < uPickingAlphaThreshold)
  69. discard; // ignore so the element below can be picked
  70. #else
  71. #if defined(dRenderVariant_colorBlended)
  72. float at = 0.0;
  73. // shift by view-offset during multi-sample rendering to allow for blending
  74. vec2 coord = gl_FragCoord.xy + uViewOffset * 0.25;
  75. const mat4 thresholdMatrix = mat4(
  76. 1.0 / 17.0, 9.0 / 17.0, 3.0 / 17.0, 11.0 / 17.0,
  77. 13.0 / 17.0, 5.0 / 17.0, 15.0 / 17.0, 7.0 / 17.0,
  78. 4.0 / 17.0, 12.0 / 17.0, 2.0 / 17.0, 10.0 / 17.0,
  79. 16.0 / 17.0, 8.0 / 17.0, 14.0 / 17.0, 6.0 / 17.0
  80. );
  81. int ci = int(intMod(coord.x, 4.0));
  82. int ri = int(intMod(coord.y, 4.0));
  83. #if __VERSION__ == 100
  84. vec4 i = vec4(float(ci * 4 + ri));
  85. vec4 v = thresholdMatrix[0] * vec4(equal(i, vec4(0.0, 1.0, 2.0, 3.0))) +
  86. thresholdMatrix[1] * vec4(equal(i, vec4(4.0, 5.0, 6.0, 7.0))) +
  87. thresholdMatrix[2] * vec4(equal(i, vec4(8.0, 9.0, 10.0, 11.0))) +
  88. thresholdMatrix[3] * vec4(equal(i, vec4(12.0, 13.0, 14.0, 15.0)));
  89. at = v.x + v.y + v.z + v.w;
  90. #else
  91. at = thresholdMatrix[ci][ri];
  92. #endif
  93. if (ta < 0.99 && (ta < 0.01 || ta < at)) {
  94. discard;
  95. }
  96. #elif defined(dRenderVariant_colorWboit)
  97. material.a *= ta;
  98. #endif
  99. #endif
  100. #endif
  101. `;