Canvas (简体中文)

自 LÖVE 0.8.0 可以使用
Framebuffer 重命名而来.


Canvas(画布)用于离屏渲染(就是不真正地绘制,只是把数据存储起来)。可以把它看成是一种无形的屏幕,你可以在上面绘制一些东西,但直到你将它绘制到实际的屏幕,它都不会被看见。它也被称为“纹理渲染(render to texture)”。

在Canvas上绘制一些不经常改变(相对)位置的东西(如背景图案,蓝天,白云形成一个整体),然后再把整个Canvas绘制出来。以此来代替每个物品都独自绘制, 这样可以减少每帧绘制操作的次数。

0.10.0 之前的版本中,并不是所有的显卡都能够支持 LÖVE 的 Canvases。love.graphics.isSupported("canvas") 可以用来在运行时检查是否支持。

O.png 往 Canvas(画布) 上绘制内容是会使用 regular alpha blengding(一种颜色混合的模型BlendMode), 所要绘制的内容的 alpha(透明度,rgba中的a) 值会直接和自己的 RGB 值相乘。

由于一旦 Canvas 要被绘制的时候,它的像素颜色都会被 premultiplied alpha(预乘混合值),所以要把 Canvas 绘制到屏幕上或者其他的 Canvas 时必须要用 premultiplied alpha blending (另外一种颜色混合模式,表示已经预乘过了)– love.graphics.setBlendMode("alpha", "premultiplied")。

 


构造函数

love.graphics.newCanvas (简体中文) 创建一个新的 Canvas(画布) Added since 0.8.0

函数

Object:release (简体中文) 立即摧毁对象在 Lua 中的引用 Added since 11.0

父类

示例

在画布上绘制物品,并将画布绘制到屏幕

function love.load()
    canvas = love.graphics.newCanvas(800, 600)

    -- 使用 regular alpha blend 颜色混合模式在画布上绘制一个矩形
    love.graphics.setCanvas(canvas)
        love.graphics.clear()
        love.graphics.setBlendMode("alpha")
        love.graphics.setColor(255, 0, 0, 128)
        love.graphics.rectangle('fill', 0, 0, 100, 100)
    love.graphics.setCanvas()
end

function love.draw()
    -- 非常重要!:在绘制 Canvas 时需要把颜色进行重置,这样 Canvas 才能正确地显示
    -- 可以看下这里的讨论: https://love2d.org/forums/viewtopic.php?f=4&p=211418#p211418
    love.graphics.setColor(255, 255, 255, 255)

    -- Canvas 中的矩形已经是混合模式
    -- 当绘制 Canvas 时需要使用 premultiplied(预乘) alpha blend 模式才能保证颜色正确的混合,如果不理解的话,就记住这个操作
    love.graphics.setBlendMode("alpha", "premultiplied")
    love.graphics.draw(canvas)
    -- 可以观察一下在普通的混合模式下两者的区别
    love.graphics.setBlendMode("alpha")
    love.graphics.draw(canvas, 100, 0)

    -- 一般的绘制物品,如矩形是直接使用 alpha blending 模式的
    love.graphics.setBlendMode("alpha")
    love.graphics.setColor(255, 0, 0, 128)
    love.graphics.rectangle('fill', 200, 0, 100, 100)
end

参见



其他语言