#image #vector #sdf #gamedev

om-fork-distance-field

临时分支!从图像生成距离场,用于伪向量渲染

1个不稳定版本

使用旧Rust 2015

0.1.8 2022年8月26日

#335 in 渲染

GPL-3.0 许可证

170KB
54

距离场

警告

这是一个临时分支,直到发布新的上游版本针对image≥0.24.2

一个用于生成距离场位图的Rust库/可执行文件,用于在着色器中渲染伪向量图像

Build Status Cargo License: GPL-3.0 Downloads

文档

生成器二进制文件

检出仓库并 cd 进入;然后运行

cargo run --example generator -- img/input.png output.png 64 64

这将使用以下图像作为输入

Rust logo

并生成一个64x64的距离场

Distance field

现在我们可以使用生成的距离场来创建矢量图像。

使用距离场

首先我们需要使用线性插值将其放大

Upscaled linear

然后应用阈值函数

Treshold

您可以看到,我们得到的是非常类似于原始输入图像的东西,而且只从一个64x64的图像中获取!但它仍然非常像素化,并不像矢量图像。这可以通过不进行硬阈值,而是允许一些灰度调色来实现。

该库的一个示例用法是将资产图像自动转换。您可以通过添加类似于以下内容的 build.rs 来实现这一点

extern crate image;
extern crate distance_field;

use std::fs::File;
use distance_field::DistanceFieldExt;

fn convert_image_to_dfield(input: &str, output: &str) {
    // Load the 'input' image
    let img = image::open(input).unwrap();

    // Generate a distance field from the image
    let outbuf = img.grayscale().distance_field(distance_field::Options {
        size: (128, 128),
        max_distance: 256,
        ..Default::default()
    });

    // Save it to 'output' as a PNG
    image::DynamicImage::ImageLuma8(outbuf).save(output).unwrap();
}

fn main() {
    convert_image_to_dfield("img/input.png", "output.png");
}

并将以下内容添加到 Cargo.toml

[packages]
build = "build.rs"

[build-dependencies]
distance-field = "0.1"
image = "0.22"

依赖项

~13MB
~60K SLoC