basic.frag 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. #version 330 core
  2. in vec3 v_normal;
  3. in vec2 v_texCoord;
  4. in vec3 v_worldPos;
  5. uniform sampler2D u_texture;
  6. uniform vec3 u_color;
  7. uniform bool u_useTexture;
  8. uniform float u_alpha;
  9. out vec4 FragColor;
  10. float hash(vec2 p) {
  11. vec3 p3 = fract(vec3(p.xyx) * 0.1031);
  12. p3 += dot(p3, p3.yzx + 33.33);
  13. return fract((p3.x + p3.y) * p3.z);
  14. }
  15. float noise(vec2 p) {
  16. vec2 i = floor(p);
  17. vec2 f = fract(p);
  18. f = f * f * (3.0 - 2.0 * f);
  19. float a = hash(i);
  20. float b = hash(i + vec2(1.0, 0.0));
  21. float c = hash(i + vec2(0.0, 1.0));
  22. float d = hash(i + vec2(1.0, 1.0));
  23. return mix(mix(a, b, f.x), mix(c, d, f.x), f.y);
  24. }
  25. vec3 proceduralMaterialVariation(vec3 baseColor, vec3 worldPos, vec3 normal) {
  26. vec2 uv = worldPos.xz * 4.0;
  27. float avgColor = (baseColor.r + baseColor.g + baseColor.b) / 3.0;
  28. vec3 variation = baseColor;
  29. if (avgColor < 0.40) {
  30. float metalNoise = noise(uv * 9.0) * 0.018;
  31. float viewAngle = abs(dot(normal, normalize(vec3(0.0, 1.0, 0.5))));
  32. float fresnel = pow(1.0 - viewAngle, 2.0) * 0.10;
  33. variation = baseColor + vec3(metalNoise + fresnel);
  34. } else if (avgColor > 0.65) {
  35. float weaveX = sin(worldPos.x * 55.0);
  36. float weaveZ = sin(worldPos.z * 55.0);
  37. float weavePattern = weaveX * weaveZ * 0.025;
  38. float clothNoise = noise(uv * 2.5) * 0.10 - 0.05;
  39. float viewAngle = abs(dot(normal, normalize(vec3(0.0, 1.0, 0.5))));
  40. float sheen = pow(1.0 - viewAngle, 3.0) * 0.15;
  41. variation = baseColor * (1.0 + clothNoise + weavePattern) + vec3(sheen);
  42. } else {
  43. float leatherNoise = noise(uv * 5.5);
  44. float blotches = noise(uv * 1.8) * 0.12 - 0.06;
  45. variation = baseColor * (1.0 + leatherNoise * 0.14 - 0.07 + blotches);
  46. }
  47. return clamp(variation, 0.0, 1.0);
  48. }
  49. void main() {
  50. vec3 color = u_color;
  51. if (u_useTexture) {
  52. color *= texture(u_texture, v_texCoord).rgb;
  53. }
  54. vec3 normal = normalize(v_normal);
  55. color = proceduralMaterialVariation(color, v_worldPos, normal);
  56. vec3 lightDir = normalize(vec3(1.0, 1.0, 1.0));
  57. float avgColor = (u_color.r + u_color.g + u_color.b) / 3.0;
  58. float wrapAmount = avgColor > 0.65 ? 0.52 : (avgColor > 0.40 ? 0.20 : 0.05);
  59. float nDotL = dot(normal, lightDir);
  60. float diff = max(nDotL * (1.0 - wrapAmount) + wrapAmount, 0.22);
  61. color *= diff;
  62. FragColor = vec4(color, u_alpha);
  63. }