|
- code = "function lovr.load()\n -- Create a ShaderBlock to store positions for 1000 models\n block = lovr.graphics.newShaderBlock('uniform', {\n modelPositions = { 'mat4', 1000 }\n }, { usage = 'static' })\n\n -- Write some random transforms to the block\n local transforms = {}\n for i = 1, 1000 do\n transforms[i] = lovr.math.mat4()\n local random, randomNormal = lovr.math.random, lovr.math.randomNormal\n transforms[i]:translate(randomNormal(8), randomNormal(8), randomNormal(8))\n transforms[i]:rotate(random(2 * math.pi), random(), random(), random())\n end\n block:send('modelPositions', transforms)\n\n -- Create the shader, injecting the shader code for the block\n shader = lovr.graphics.newShader(\n block:getShaderCode('ModelBlock') .. [[\n vec4 position(mat4 project, mat4 transform, vec4 vertex) {\n return lovrProjection * lovrTransform * modelPositions[gl_InstanceID] * lovrVertex;\n }\n ]], nil)\n\n -- Bind the block to the shader\n shader:sendBlock('ModelBlock', block)\n model = lovr.graphics.newModel('monkey.obj')\nend\n\n-- Draw the model 1000 times, using positions from the shader block\nfunction lovr.draw()\n lovr.graphics.setShader(shader)\n model:draw(lovr.math.mat4(), 1000)\n lovr.graphics.setShader()\nend"
|
|
|
|
|
|
+ code = "function lovr.load()\n -- Create a ShaderBlock to store positions for 1000 models\n block = lovr.graphics.newShaderBlock('uniform', {\n modelPositions = { 'mat4', 1000 }\n }, { usage = 'static' })\n\n -- Write some random transforms to the block\n local transforms = {}\n for i = 1, 1000 do\n transforms[i] = lovr.math.mat4()\n local random, randomNormal = lovr.math.random, lovr.math.randomNormal\n transforms[i]:translate(randomNormal(8), randomNormal(8), randomNormal(8))\n transforms[i]:rotate(random(2 * math.pi), random(), random(), random())\n end\n block:send('modelPositions', transforms)\n\n -- Create the shader, injecting the shader code for the block\n shader = lovr.graphics.newShader(\n block:getShaderCode('ModelBlock') .. [[\n vec4 position(mat4 projection, mat4 transform, vec4 vertex) {\n return projection * transform * modelPositions[lovrInstanceID] * vertex;\n }\n ]], [[\n vec4 color(vec4 gcolor, sampler2D image, vec2 uv) {\n return gcolor * texture(image, uv);\n }\n ]])\n\n -- Bind the block to the shader\n shader:sendBlock('ModelBlock', block)\n model = lovr.graphics.newModel('monkey.obj')\nend\n\n-- Draw the model 1000 times, using positions from the shader block\nfunction lovr.draw()\n lovr.graphics.setShader(shader)\n model:draw(lovr.math.mat4(), 1000)\n lovr.graphics.setShader()\nend"
|
|
notes = "- A Shader can use up to 8 ShaderBlocks.\n- ShaderBlocks can not contain textures.\n- Some systems have bugs with `vec3` variables in ShaderBlocks. If you run into strange bugs,\n try switching to a `vec4` for the variable.",
|
|
notes = "- A Shader can use up to 8 ShaderBlocks.\n- ShaderBlocks can not contain textures.\n- Some systems have bugs with `vec3` variables in ShaderBlocks. If you run into strange bugs,\n try switching to a `vec4` for the variable.",
|