|
@@ -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
|