2
0
Эх сурвалжийг харах

Improve Grid (Smooth) example;

bjorn 11 сар өмнө
parent
commit
74eb48234f

+ 21 - 19
examples/Environment/Grid_(Smooth)/main.lua

@@ -1,33 +1,35 @@
 function lovr.load()
   shader = lovr.graphics.newShader([[
+    out vec2 scale;
+
     vec4 lovrmain() {
+      scale = vec2(length(Transform[0]), length(Transform[1]));
       return DefaultPosition;
     }
   ]], [[
-    const float gridSize = 25.;
-    const float cellSize = .5;
-
-    vec4 lovrmain() {
-      vec2 uv = UV;
+    uniform float lineWidth;
 
-      // Distance-based alpha (1. at the middle, 0. at edges)
-      float alpha = 1. - smoothstep(.15, .50, distance(uv, vec2(.5)));
+    in vec2 scale;
 
-      // Grid coordinate
-      uv *= gridSize;
-      uv /= cellSize;
-      vec2 c = abs(fract(uv - .5) - .5) / fwidth(uv);
-      float line = clamp(1. - min(c.x, c.y), 0., 1.);
-      vec3 value = mix(vec3(.01, .01, .011), (vec3(.04)), line);
-
-      return vec4(vec3(value), alpha);
+    // https://bgolus.medium.com/the-best-darn-grid-shader-yet-727f9278b9d8
+    vec4 lovrmain() {
+      vec2 uv = (UV - 1.) * scale;
+      vec4 uvDDXY = vec4(dFdx(uv), dFdy(uv));
+      vec2 uvDeriv = vec2(length(uvDDXY.xz), length(uvDDXY.yw));
+      vec2 drawWidth = clamp(vec2(lineWidth), uvDeriv, vec2(.5));
+      vec2 lineAA = uvDeriv * 1.5;
+      vec2 gridUV = 1.0 - abs(fract(uv) * 2. - 1.);
+      vec2 grid2 = smoothstep(lineWidth + lineAA, lineWidth - lineAA, gridUV);
+      grid2 *= clamp(lineWidth / drawWidth, 0., 1.);
+      grid2 = mix(grid2, vec2(lineWidth), clamp(uvDeriv * 2. - 1., 0., 1.));
+      float grid = mix(grid2.x, 1., grid2.y);
+      return vec4(Color.rgb * grid, Color.a);
     }
-  ]], { flags = { highp = true } })
-
-  lovr.graphics.setBackgroundColor(.05, .05, .05)
+  ]])
 end
 
 function lovr.draw(pass)
   pass:setShader(shader)
-  pass:plane(0, 0, 0, 25, 25, -math.pi / 2, 1, 0, 0)
+  pass:send('lineWidth', .05)
+  pass:plane(0, 0, 0, 50, 50, -math.pi / 2, 1, 0, 0)
 end