12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970 |
- 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
- ]=]
- }
- }
|