main.lua 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. function lovr.load()
  2. grass = lovr.graphics.newTexture('grass.png')
  3. rock = lovr.graphics.newTexture('rock.png')
  4. dirt = lovr.graphics.newTexture('dirt.png')
  5. triplanar = lovr.graphics.newShader('unlit', [[
  6. layout(set = 2, binding = 0) uniform texture2D textureX;
  7. layout(set = 2, binding = 1) uniform texture2D textureY;
  8. layout(set = 2, binding = 2) uniform texture2D textureZ;
  9. Constants {
  10. float textureScale;
  11. };
  12. vec4 lovrmain() {
  13. vec2 xscale = vec2(-sign(Normal.x), -1.);
  14. vec2 yscale = vec2( sign(Normal.y), +1.);
  15. vec2 zscale = vec2( sign(Normal.z), -1.);
  16. vec3 colorX = getPixel(textureX, PositionWorld.zy * textureScale * xscale).rgb;
  17. vec3 colorY = getPixel(textureY, PositionWorld.xz * textureScale * yscale).rgb;
  18. vec3 colorZ = getPixel(textureZ, PositionWorld.xy * textureScale * zscale).rgb;
  19. vec3 normal = abs(normalize(Normal));
  20. vec3 weight = normal / (normal.x + normal.y + normal.z);
  21. vec3 color = colorX * weight.x + colorY * weight.y + colorZ * weight.z;
  22. return Color * vec4(color, 1.);
  23. }
  24. ]])
  25. end
  26. function lovr.draw(pass)
  27. pass:setShader(triplanar)
  28. pass:send('textureScale', 1.0)
  29. pass:send('textureX', rock)
  30. pass:send('textureY', grass)
  31. pass:send('textureZ', dirt)
  32. local width = 4 + 2 * math.cos(lovr.timer.getTime())
  33. local height = 3 + 2 * math.sin(lovr.timer.getTime())
  34. pass:box(0, -2, -10, width, height, 3)
  35. end