basic.fs 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. #version 300 es
  2. precision highp float;
  3. in vec3 fragPosition;
  4. in vec2 fragTexCoord;
  5. in vec4 fragColor;
  6. in vec3 fragNormal;
  7. uniform vec4 colDiffuse;
  8. uniform float specularity;
  9. uniform float glossiness;
  10. uniform float camClipNear;
  11. uniform float camClipFar;
  12. layout (location = 0) out vec4 gbufferColor;
  13. layout (location = 1) out vec4 gbufferNormal;
  14. float Grid(in vec2 uv, in float lineWidth)
  15. {
  16. vec4 uvDDXY = vec4(dFdx(uv), dFdy(uv));
  17. vec2 uvDeriv = vec2(length(uvDDXY.xz), length(uvDDXY.yw));
  18. float targetWidth = lineWidth > 0.5 ? 1.0 - lineWidth : lineWidth;
  19. vec2 drawWidth = clamp(
  20. vec2(targetWidth, targetWidth), uvDeriv, vec2(0.5, 0.5));
  21. vec2 lineAA = uvDeriv * 1.5;
  22. vec2 gridUV = abs(fract(uv) * 2.0 - 1.0);
  23. gridUV = lineWidth > 0.5 ? gridUV : 1.0 - gridUV;
  24. vec2 g2 = smoothstep(drawWidth + lineAA, drawWidth - lineAA, gridUV);
  25. g2 *= clamp(targetWidth / drawWidth, 0.0, 1.0);
  26. g2 = mix(g2, vec2(targetWidth, targetWidth),
  27. clamp(uvDeriv * 2.0 - 1.0, 0.0, 1.0));
  28. g2 = lineWidth > 0.5 ? 1.0 - g2 : g2;
  29. return mix(g2.x, 1.0, g2.y);
  30. }
  31. float Checker(in vec2 uv)
  32. {
  33. vec4 uvDDXY = vec4(dFdx(uv), dFdy(uv));
  34. vec2 w = vec2(length(uvDDXY.xz), length(uvDDXY.yw));
  35. vec2 i = 2.0*(abs(fract((uv-0.5*w)*0.5)-0.5)-
  36. abs(fract((uv+0.5*w)*0.5)-0.5))/w;
  37. return 0.5 - 0.5*i.x*i.y;
  38. }
  39. vec3 FromGamma(in vec3 col)
  40. {
  41. return vec3(pow(col.x, 1.0/2.2), pow(col.y, 1.0/2.2), pow(col.z, 1.0/2.2));
  42. }
  43. float LinearDepth(float depth, float near, float far)
  44. {
  45. return (2.0 * near) / (far + near - depth * (far - near));
  46. }
  47. void main()
  48. {
  49. float gridFine = Grid(20.0 * 10.0 * fragTexCoord, 0.025);
  50. float gridCoarse = Grid(2.0 * 10.0 * fragTexCoord, 0.02);
  51. float check = Checker(2.0 * 10.0 * fragTexCoord);
  52. vec3 albedo = FromGamma(fragColor.xyz * colDiffuse.xyz) * mix(mix(mix(0.9, 0.95, check), 0.85, gridFine), 1.0, gridCoarse);
  53. float spec = specularity * mix(mix(0.5, 0.75, check), 1.0, gridCoarse);
  54. gbufferColor = vec4(albedo, spec);
  55. gbufferNormal = vec4(fragNormal * 0.5f + 0.5f, glossiness / 100.0f);
  56. gl_FragDepth = LinearDepth(gl_FragCoord.z, camClipNear, camClipFar);
  57. }