builder.frag 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. #version 330 core
  2. in vec3 v_normal;
  3. in vec2 v_texCoord;
  4. in vec3 v_worldPos;
  5. in vec3 v_instanceColor;
  6. in float v_instanceAlpha;
  7. uniform sampler2D u_texture;
  8. uniform vec3 u_color;
  9. uniform bool u_useTexture;
  10. uniform float u_alpha;
  11. uniform bool u_instanced;
  12. out vec4 FragColor;
  13. float hash(vec2 p) {
  14. vec3 p3 = fract(vec3(p.xyx) * 0.1031);
  15. p3 += dot(p3, p3.yzx + 33.33);
  16. return fract((p3.x + p3.y) * p3.z);
  17. }
  18. float noise(vec2 p) {
  19. vec2 i = floor(p);
  20. vec2 f = fract(p);
  21. f = f * f * (3.0 - 2.0 * f);
  22. float a = hash(i);
  23. float b = hash(i + vec2(1.0, 0.0));
  24. float c = hash(i + vec2(0.0, 1.0));
  25. float d = hash(i + vec2(1.0, 1.0));
  26. return mix(mix(a, b, f.x), mix(c, d, f.x), f.y);
  27. }
  28. float clothWeave(vec2 p) {
  29. float warpThread = sin(p.x * 70.0);
  30. float weftThread = sin(p.y * 68.0);
  31. return warpThread * weftThread * 0.06;
  32. }
  33. float leatherGrain(vec2 p) {
  34. return noise(p * 16.0) * 0.12 + noise(p * 28.0) * 0.06;
  35. }
  36. void main() {
  37. vec3 base_color_in = u_instanced ? v_instanceColor : u_color;
  38. float alpha_in = u_instanced ? v_instanceAlpha : u_alpha;
  39. vec3 color = base_color_in;
  40. if (u_useTexture) {
  41. color *= texture(u_texture, v_texCoord).rgb;
  42. }
  43. vec3 normal = normalize(v_normal);
  44. vec2 uv = v_worldPos.xz * 4.5;
  45. float avgColor = (color.r + color.g + color.b) / 3.0;
  46. if (avgColor > 0.65) {
  47. float weave = clothWeave(v_worldPos.xz);
  48. float folds = noise(uv * 8.0) * 0.13;
  49. float viewAngle = abs(dot(normal, normalize(vec3(0.0, 1.0, 0.2))));
  50. float clothSheen = pow(1.0 - viewAngle, 9.0) * 0.12;
  51. color *= 1.0 + weave + folds - 0.03;
  52. color += vec3(clothSheen);
  53. }
  54. else if (avgColor > 0.30) {
  55. float leather = leatherGrain(uv);
  56. float viewAngle = abs(dot(normal, normalize(vec3(0.0, 1.0, 0.4))));
  57. float leatherSheen = pow(1.0 - viewAngle, 6.0) * 0.10;
  58. color *= 1.0 + leather - 0.04;
  59. color += vec3(leatherSheen);
  60. } else {
  61. float detail = noise(uv * 10.0) * 0.10;
  62. color *= 1.0 + detail - 0.06;
  63. }
  64. color = clamp(color, 0.0, 1.0);
  65. vec3 lightDir = normalize(vec3(1.0, 1.2, 1.0));
  66. float nDotL = dot(normal, lightDir);
  67. float wrapAmount = 0.45;
  68. float diff = max(nDotL * (1.0 - wrapAmount) + wrapAmount, 0.28);
  69. color *= diff;
  70. FragColor = vec4(color, alpha_in);
  71. }