Przeglądaj źródła

Port Instancing example;

bjorn 2 lat temu
rodzic
commit
9a19f296ec
1 zmienionych plików z 20 dodań i 28 usunięć
  1. 20 28
      examples/Optimization/Instancing/main.lua

+ 20 - 28
examples/Optimization/Instancing/main.lua

@@ -3,12 +3,7 @@
 function lovr.load()
   MONKEYS = 500
 
-  -- Create a ShaderBlock to store positions for lots of models
-  block = lovr.graphics.newShaderBlock('uniform', {
-    modelTransforms = { 'mat4', MONKEYS }
-  }, { usage = 'static' })
-
-  -- Write some random transforms to the block
+  -- Create some random transforms
   local transforms = {}
   local random, randomNormal = lovr.math.random, lovr.math.randomNormal
   for i = 1, MONKEYS do
@@ -17,34 +12,31 @@ function lovr.load()
     local scale = vec3(.75)
     transforms[i] = mat4(position, scale, orientation)
   end
-  block:send('modelTransforms', transforms)
 
-  -- Create the shader, injecting the shader code for the block
-  shader = lovr.graphics.newShader(
-    block:getShaderCode('ModelBlock') .. [[
-    out vec3 vNormal;
-    vec4 position(mat4 projection, mat4 transform, vec4 vertex) {
-      vNormal = lovrNormal;
-      return projection * transform * modelTransforms[lovrInstanceID] * vertex;
+  transformBuffer = lovr.graphics.newBuffer(transforms, 'mat4')
+
+  shader = lovr.graphics.newShader([[
+    layout(set = 2, binding = 0) uniform Transforms {
+      mat4 transforms[500];
+    };
+
+    vec4 lovrmain() {
+      return Projection * View * transforms[InstanceIndex] * VertexPosition;
     }
   ]], [[
-    in vec3 vNormal;
-    vec4 color(vec4 graphicsColor, sampler2D image, vec2 uv) {
-      return vec4(vNormal * .5 + .5, 1.);
+    vec4 lovrmain() {
+      return vec4(Normal * .5 + .5, 1.);
     }
   ]])
 
-  -- Bind the block to the shader
-  shader:sendBlock('ModelBlock', block)
-
-  model = lovr.graphics.newModel('monkey.obj')
-  lovr.graphics.setCullingEnabled(true)
-  lovr.graphics.setBlendMode(nil)
+  monkey = lovr.graphics.newModel('monkey.obj')
 end
 
--- Draw many copies of the model using instancing, with transforms from the shader block
-function lovr.draw()
-  lovr.graphics.setShader(shader)
-  model:draw(mat4(), MONKEYS)
-  lovr.graphics.setShader()
+-- Draw many copies of the model with 1 draw, taking transforms from the buffer
+function lovr.draw(pass)
+  pass:setBlendMode()
+  pass:setCullMode('back')
+  pass:setShader(shader)
+  pass:send('Transforms', transformBuffer)
+  pass:draw(monkey, mat4(), nil, nil, MONKEYS)
 end