#graphics-api #graphics #shader #game

renderling

用户友好的实时渲染。 🍖

17个版本

0.4.7 2024年6月3日
0.4.6 2024年5月31日
0.2.6 2022年11月25日
0.2.3 2022年9月28日
0.1.0 2022年2月17日

#10 in 渲染

Download history 572/week @ 2024-05-13 35/week @ 2024-05-20 325/week @ 2024-05-27 173/week @ 2024-06-03 11/week @ 2024-06-10

953 每月下载次数
用于 renderling_ui

MIT/Apache

575KB
13K SLoC

renderling 🍖

Renderling是一个创新的、由GPU驱动的渲染器,专为高效场景渲染而设计,重点关注利用GPU能力进行几乎所有渲染操作。通过Rust进行着色器开发,它确保了内存安全和跨平台兼容性,包括Web平台。目前处于alpha阶段的项目旨在快速加载GLTF文件,处理大型场景,并支持众多光源。开发侧重于性能、人体工程学、可观察性和使用现代渲染技术(如前向+渲染和基于物理的着色)。

ibl_environment_test

该项目由NLnet作为NGI Zero Core的一部分赞助。

什么是

renderling在GPU缓冲区中持有整个场景的几何形状、纹理、材质、光照,甚至场景图本身。除了少数渲染操作在GPU上发生之外,其他所有渲染操作都在GPU上完成。CPU用于与文件系统交互,将数据打包到GPU并更新变换。

着色器通过rust-gpu在Rust中编写。

为什么我应该使用renderling

  • 数据可以通过自动引用计数的slab分配器轻松地加载到GPU,该分配器提供从CPU的访问权限。

    您的场景几何形状、材质、动画等所有内容都驻留在GPU上,而CPU可以轻松地读取和修改这些数据,无需借用 - 使您可以将数据通过线程发送到任何需要它的地方。

  • 将所有内容都放在GPU上使renderling在渲染某些类型的场景方面非常有效。

    具体来说,renderling旨在擅长渲染具有中等独特几何形状的场景(可能是大量重复的几何形状),少量大纹理(或大量小纹理),以及大量光照效果。

  • 与GLTF的紧密集成

    • 加载场景、节点、动画等
    • 包括控制动画的工具
    • 支持的扩展
      • KHR_lights_punctual
      • KHR_materials_unlit
      • KHR_materials_emissive_strength
  • 基于图像的光照+分析光照

  • 良好的文档

API功能

  • 场景、实体(场景节点)、材质和光照的构建器模式
  • 无头渲染支持
    • 通过image包将渲染到纹理并保存
  • 文本渲染支持(货物功能 text - 默认开启)
  • 具有本地变换的嵌套节点
  • 通过 gltf 加载场景的紧密支持(货物功能 gltf - 默认开启)

尽可能使用 Rust 通过 rust-gpu 编写着色器,必要时回退到 wgsl

渲染功能/路线图

渲染采用 forward+ 渲染方法。

默认情况下,它使用单个超级着色器进行渲染。

  • 纹理图集
  • 视锥体裁剪
  • 遮挡裁剪
  • 光照贴图
  • 阴影映射
  • 3D
    • 内置对常见光照/材料工作流程的支持
      • 基于物理的着色
      • 非光照
    • 高动态范围
    • 天空盒
    • 基于图像的光照
      • 漫反射
      • 镜面反射
    • MSAA(由于forward+而易于实现)
    • “基于物理”的上采样+下采样模糊(光晕效果)
    • SSAO
    • 景深
    • 对glTF的支持
      • 场景
      • 节点
      • 摄像机
      • 网格
      • 材质
        • PBR金属粗糙度(因素 + 纹理)
        • 法线贴图
        • 遮挡纹理
        • PBR镜面光泽度
        • 视差贴图
      • 纹理、图像、采样器
      • 动画
        • 插值
        • 蒙皮(仍在修复一个 问题
        • 形变目标(需要重新构建)
  • 2D
    • 文本
    • 描边和填充路径
      • 三次贝塞尔曲线
      • 二次贝塞尔曲线
      • 任意多边形
      • 用图像填充

定义

renderling 名词

一个小巧玲珑的生物,近距离看起来很可爱,随时准备为您执行图形任务。

俳句

机器中的幽灵,用魔法照亮您的场景。可爱的技术。

项目组织

  • crates/renderling-shader

    包含可以在CPU和GPU上共享的Rust着色器代码(使用 rust-gpu 编译为SPIR-V)。大多数着色器代码都在这里!某些任务需要原子操作,但这还不能从 rust-gpuwgpu 实现。参见 NOTES.md。此包是工作空间的一部分,因此您可以在Rust中编写着色器时获得良好的编辑器工具。您还可以编写运行测试的测试,这些测试可以通过 cargo test 执行。一切如常工作。

  • 着色器

    包含一个围绕 renderling-shader 的薄包封装。提供着色器的SPIR-V注释。包含一个程序,将Rust编译为SPIR-V,并将 .spv 文件复制到主 renderling 包。

  • crates/renderling

    主包。包含用于创建管线和管理资源的CPU Rust代码,创建渲染通道等。包含测试,其中一些使用实际帧渲染的图像比较以保持一致性和向后兼容性。

  • img

    测试图像资产(纹理等)

  • test_img

    用于测试的参考图像。

  • crates/example

    包含使用 renderling 包创建应用程序的示例。

测试

测试在无头模式下使用 renderling,并生成与预期输出进行比较的图像。

运行测试

cargo test

构建着色器

shaders/ 文件夹是一个排除在 cargo 工作区之外的包。它编译成一个程序,可以运行以生成着色器

cd shaders/ && cargo run --release

在WASM上构建

RUSTFLAGS=--cfg=web_sys_unstable_apis trunk build crates/example-wasm/index.html && basic-http-server -a 127.0.0.1:8080 crates/example-wasm/dist

🫶 赞助这个项目!

这项工作将始终免费且开源。如果您使用它(直接使用或作为灵感来源),请考虑捐赠。

💰 赞助 💝

特别感谢

  • James Harton (@jimsynz),捐赠了多个带有物理GPU的Linux CI运行器!

许多项目都源于解决renderling中的需求。其中一些解决方案后来衍生出自己的项目。

  • crabslab 跨CPU/GPU边界工作的内存分配器。
  • loading-bytes 一种跨平台(包括网络)且非常小巧的文件加载到字节数组的方法。
  • moongraph DAG和资源图运行器。
  • naga的贡献
    • 在SPIR-V前端添加原子支持(进行中)
  • gltf的贡献

赞助这个项目有助于推动生态系统的发展。

许可证

Renderling是免费且开源的。本仓库中的所有代码都采用以下双许可方式

MIT License (LICENSE-MIT or http://opensource.org/licenses/MIT)
Apache License, Version 2.0 (LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0)

您可以选择。这意味着您可以选择您喜欢的许可!这种双许可方法在Rust生态系统中是事实上的标准,并且包含两者的原因非常充分。

除非您明确表示,否则您根据Apache-2.0许可证定义的,有意提交以包含在工作中的任何贡献,都将如上所述双许可,不附加任何额外条款或条件。

备注 & 开发日志

我在这里保留了一份关于这个项目的(非)组织化笔记列表 这里。我保留了一份开发日志 这里

依赖关系

~5–46MB
~735K SLoC