main.lua 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. -- Surround yourself with 1000 monkeys, efficiently
  2. function lovr.load()
  3. MONKEYS = 1000
  4. -- Create a ShaderBlock to store positions for lots of models
  5. block = lovr.graphics.newShaderBlock({
  6. modelPositions = { 'mat4', MONKEYS }
  7. }, { writable = false, usage = 'static' })
  8. -- Write some random transforms to the block
  9. local transforms = {}
  10. for i = 1, MONKEYS do
  11. local transform = lovr.math.newTransform()
  12. local random, randomNormal = lovr.math.random, lovr.math.randomNormal
  13. transform:translate(randomNormal(8), randomNormal(8), randomNormal(8))
  14. transform:rotate(random(2 * math.pi), random(), random(), random())
  15. transforms[i] = transform
  16. end
  17. block:send('modelPositions', transforms)
  18. -- Create the shader, injecting the shader code for the block
  19. shader = lovr.graphics.newShader(
  20. block:getShaderCode('ModelBlock') .. [[
  21. out vec3 vNormal;
  22. vec4 position(mat4 projection, mat4 transform, vec4 vertex) {
  23. vNormal = lovrNormal;
  24. return projection * transform * modelPositions[lovrInstanceID] * vertex;
  25. }
  26. ]], [[
  27. in vec3 vNormal;
  28. vec4 color(vec4 graphicsColor, sampler2D image, vec2 uv) {
  29. return vec4(vNormal * .5 + .5, 1.);
  30. }
  31. ]])
  32. -- Bind the block to the shader
  33. shader:sendBlock('ModelBlock', block)
  34. model = lovr.graphics.newModel('monkey.obj')
  35. end
  36. -- Draw the model 1000 times, using positions from the shader block
  37. function lovr.draw()
  38. lovr.graphics.setCullingEnabled(true)
  39. lovr.graphics.setShader(shader)
  40. model:drawInstanced(MONKEYS)
  41. lovr.graphics.setShader()
  42. end