return { summary = 'An offscreen render target.', description = [[ A Canvas is also known as a framebuffer or render-to-texture. It allows you to render to a texture instead of directly to the screen. This lets you postprocess or transform the results later before finally rendering them to the screen. After creating a Canvas, you can attach Textures to it using `Canvas:setTexture`. ]], constructors = { 'lovr.graphics.newCanvas' }, notes = [[ Up to four textures can be attached to a Canvas and anything rendered to the Canvas will be broadcast to all attached Textures. If you want to do render different things to different textures, use the `multicanvas` shader flag when creating your shader and implement the `void colors` function instead of the usual `vec4 color` function. You can then assign different output colors to `lovrCanvas[0]`, `lovrCanvas[1]`, etc. instead of returning a single color. Each color written to the array will end up in the corresponding texture attached to the Canvas. ]], example = { description = 'Apply a postprocessing effect (wave) using a Canvas and a fragment shader.', code = [=[ function lovr.load() lovr.graphics.setBackgroundColor(.1, .1, .1) canvas = lovr.graphics.newCanvas(lovr.headset.getDisplayDimensions()) wave = lovr.graphics.newShader([[ vec4 position(mat4 projection, mat4 transform, vec4 vertex) { return vertex; } ]], [[ uniform float time; vec4 color(vec4 graphicsColor, sampler2D image, vec2 uv) { uv.x += sin(uv.y * 10 + time * 4) * .01; uv.y += cos(uv.x * 10 + time * 4) * .01; return graphicsColor * lovrDiffuseColor * vertexColor * texture(image, uv); } ]]) end function lovr.update(dt) wave:send('time', lovr.timer.getTime()) end function lovr.draw() -- Render the scene to the canvas instead of the headset. canvas:renderTo(function() lovr.graphics.clear() local size = 5 for i = 1, size do for j = 1, size do for k = 1, size do lovr.graphics.setColor(i / size, j / size, k / size) local x, y, z = i - size / 2, j - size / 2, k - size / 2 lovr.graphics.cube('fill', x, y, z, .5) end end end end) -- Render the canvas to the headset using a shader. lovr.graphics.setColor(1, 1, 1) lovr.graphics.setShader(wave) lovr.graphics.fill(canvas:getTexture()) lovr.graphics.setShader() end ]=] } }