跳到主要内容

渲染器(Renderer)

提供绘制路径和图像、管理裁剪以及 在渲染期间应用变换的功能。

方法(Methods)​

drawPath​

drawPath(path: Path, paint: Paint) -> ()

使用指定的 画笔(Paint) 绘制给定的 路径(Path)。

更多详细说明和工作示例,请参阅 使用节点脚本绘制。

function draw(self: Rectangle, renderer: Renderer)
renderer:drawPath(self.path, self.paint)
end

drawImage​

drawImage(image: Image, sampler: ImageSampler, blendMode: BlendMode, opacity: number) -> ()

使用 图像采样器(ImageSampler)、混合模式(BlendMode) 和透明度绘制 图像(Image)。

查看 脚本演示 以了解工作示例。

type DrawImage = {
myImage: Image?,
sampler: ImageSampler?,
}

function init(self: DrawImage, context: Context): boolean
self.myImage = context:image('myImage')
self.sampler = ImageSampler('clamp', 'clamp', 'bilinear')

return true
end

function draw(self: DrawImage, renderer: Renderer)
if self.myImage and self.sampler then
renderer:drawImage(self.myImage, self.sampler, 'srcOver', 1)
end
end

return function(): Node<DrawImage>
return {
myImage = nil,
sampler = nil,
init = init,
draw = draw,
}
end

drawImageMesh​

drawImageMesh(image: Image, sampler: ImageSampler, vertices: VertexBuffer, uvs: VertexBuffer, triangles: TriangleBuffer, blendMode: BlendMode, opacity: number) -> ()

使用由顶点、纹理坐标和三角形索引定义的网格数据绘制图像。

查看 脚本演示 以了解工作示例。

function draw(self: DrawImageMesh, renderer: Renderer)
if self.myImage and self.sampler and self.vertices and self.uvs and self.triangles then
renderer:drawImageMesh(
self.myImage,
self.sampler,
self.vertices,
self.uvs,
self.triangles,
'srcOver',
1
)
end
end

drawImageMeshInstanced​

drawImageMeshInstanced(image: Image, sampler: ImageSampler, vertices: VertexBuffer, uvs: VertexBuffer, triangles: TriangleBuffer, instances: MeshInstances) -> ()

在一次调用中,按 网格实例(MeshInstances) 的每一项各绘制一遍同一网格。 混合模式始终为 srcOver。透明度和 UV 变换来自每个实例。

function draw(self: DrawImageMeshInstanced, renderer: Renderer)
if self.myImage and self.sampler and self.vertices and self.uvs and self.triangles and self.instances then
renderer:drawImageMeshInstanced(
self.myImage,
self.sampler,
self.vertices,
self.uvs,
self.triangles,
self.instances
)
end
end

clipPath​

clipPath(path: Path) -> ()

将后续绘制限制在给定 路径(Path) 定义的区域内。 裁剪在下一次 restore 调用之前持续生效。

查看 脚本演示 以了解工作示例。

function draw(self: DrawImageClipped, renderer: Renderer)
if self.myImage and self.sampler then
local w: number = self.myImage.width
local h: number = self.myImage.height
local rx: number = (w / 2) * self.clipRadiusX
local ry: number = (h / 2) * self.clipRadiusY
buildOvalPath(self.clipPath, w / 2, h / 2, rx, ry)

renderer:save()
renderer:clipPath(self.clipPath)
renderer:drawImage(self.myImage, self.sampler, 'srcOver', 1)
renderer:restore()
end
end

save​

save() -> ()

保存当前渲染状态,包括变换和裁剪状态。

function draw(self: MyGame, renderer: Renderer)
-- draw each enemy
for _, enemy in self.enemies do
renderer:save()
enemy.artboard:draw(renderer)
renderer:restore()
end
end

restore​

restore() -> ()

恢复最近一次保存的渲染状态。

function draw(self: MyGame, renderer: Renderer)
-- draw each enemy
for _, enemy in self.enemies do
renderer:save()
enemy.artboard:draw(renderer)
renderer:restore()
end
end

transform​

transform(transform: Mat2D) -> ()

对当前渲染状态应用变换。变换会累计生效,直到 restore 为止。

function draw(self: TransformedImage, renderer: Renderer)
if self.myImage and self.sampler then
local m = Mat2D.withScale(2, 3)
-- 直接调整矩阵项以获得额外的倾斜/拉伸控制。
m.xx = 5

renderer:save()
renderer:transform(m)
renderer:drawImage(self.myImage, self.sampler, 'srcOver', 1)
renderer:restore()
end
end

modulateOpacity​

modulateOpacity(opacity: number) -> ()

将后续绘制调用的不透明度乘以 opacity(0..1)。 按乘法叠加,并由 save()/restore() 捕获,因此常见写法是:renderer:save(); renderer:modulateOpacity(a); ... draw ...; renderer:restore()。

modulateColor​

modulateColor(color: Color) -> ()

将 color 按通道乘入后续绘制调用。 与 modulateOpacity 一样会叠加,并由 save()/restore() 捕获。

setColorModulation​

setColorModulation(color: Color) -> ()

直接设置调制颜色,而不是相乘,从而让内层作用域撤销外层的调制:先在黑色下绘制画板,再为应保留自身绘制颜色的可绘制对象设置颜色。 由 save()/restore() 捕获;在 draw visitor 内部,该设置会随本次访问结束,因此 visitor 自身不需要 save()/restore()。

看完还有疑问?进群交流下!
与众多 Rive 创作者、开发者一起交流探讨与答疑解惑。
加入交流群