#3d-rendering #3d #graphics #raster #renderer #vertex-shader #fragment-shader

无 std euc

一个软件渲染库,允许您使用 Rust 编写着色器

10 个版本

0.5.3 2021 年 3 月 9 日
0.5.2 2020 年 11 月 19 日
0.5.0 2020 年 4 月 12 日
0.4.3 2020 年 1 月 17 日
0.1.0 2019 年 2 月 9 日

图形 API 中排名 360

Download history 149/week @ 2024-03-11 166/week @ 2024-03-18 162/week @ 2024-03-25 186/week @ 2024-04-01 156/week @ 2024-04-08 173/week @ 2024-04-15 172/week @ 2024-04-22 141/week @ 2024-04-29 155/week @ 2024-05-06 157/week @ 2024-05-13 161/week @ 2024-05-20 141/week @ 2024-05-27 90/week @ 2024-06-03 130/week @ 2024-06-10 149/week @ 2024-06-17 137/week @ 2024-06-24

每月下载量 514
用于 blockish

Apache-2.0 AND MIT

71KB
522

Euc

crates.io crates.io

Utah teapot, rendered with Euc

示例

struct Example;

impl Pipeline for Example {
    type Vertex = [f32; 2];
    type VsOut = ();
    type Pixel = [u8; 4];

    // Vertex shader
    fn vert(&self, pos: &Self::Vertex) -> ([f32; 3], Self::VsOut) {
        ([pos[0], pos[1], 0.0], ())
    }

    // Fragment shader
    fn frag(&self, _: &Self::VsOut) -> Self::Pixel {
        [255, 0, 0, 255] // Red
    }
}

fn main() {
    let mut color = Buffer2d::new([640, 480], [0; 4]);
    let mut depth = Buffer2d::new([640, 480], 1.0);

    Example.draw::<Triangles<_>, _>(
        &[
            [-1.0, -1.0],
            [ 1.0, -1.0],
            [ 0.0,  1.0],
        ],
        &mut color,
        &mut depth,
    );
}

更多代码示例请参阅 examples/

什么是 euc

euc 是一个灵活、易于使用的库,允许在 CPU 上进行 3D 渲染。它具有便携、紧凑的设计,非常适合原型设计、单元测试或简单的实时应用程序。目前 euc 正在积极开发中。

为什么?

  • 现代图形 API 复杂、冗长。在 CPU 上渲染意味着更少的复杂性、更少的样板代码和更少的冗长:非常适合测试想法。

  • 现代 CPU 的速度足够快,可以使简单的 3D 程序以合理的速度运行(尽管当然无法与 GPU 相比)。仅使用 CPU 就可以编写出令人惊讶的复杂实时 3D 软件。

  • 不需要 GPU 接口意味着 euc 非常便携。因此,如果您的编译器是 nightly 版本,那么 eucno_std

  • euc 具有一致的跨平台行为,并且不需要 GPU 运行。这使得它非常适合用作单元测试工具。

  • 在 CPU 上运行允许更动态的数据访问方式。对于性能不是主要关注点的应用程序,euc 降低了低级 3D 开发的门槛,并允许实现更多新颖的图形渲染方法。

坐标系

在可能的情况下,euc 尝试使用类似于 OpenGL 的坐标系。如果您熟悉 OpenGL,您将能够轻松地与 euc 一起工作。

发布模式

默认情况下,Cargo会以调试模式编译Rust代码。在这种模式下,代码的优化非常少,因此软件渲染的性能往往会受到影响。为了以良好的性能体验此项目,请确保使用--release标志进行编译。

no_std

euc可以在没有标准库支持的平台上进行编译。这使得它非常适合在嵌入式设备上渲染3D图形。您可以通过在Cargo.toml文件中禁用默认功能并启用libm功能来启用no_std支持,如下所示

[dependencies]
euc = { version = "x.y.z", default-features = false, features = ["libm"] }

目标

  • 支持用Rust编写的可编程着色器

  • 支持常见的管道功能,如纹理采样器、多个渲染过程、统一数据等。

  • 简单、优雅的接口,可扩展性好

  • 正确性

非目标

  • 极致优化(尽管会采摘明显的低垂之果)

  • 与现有API的兼容性/合规性(例如:OpenGL)

许可证

euc的发行许可由用户自行决定

由用户决定。

依赖

~0.8–1MB
~17K SLoC