Raytracer tutorial for PPCA 2021, written in Rust.

Overview

banner

Pseudo Photograph Company of ACM

工科和ACM的朋友们都已结课!看看这些了不起的艺术品:


ACM伪摄影公司,简称PPCA,于2021年成立 😉

这个项目的主要工作是使用Rust语言实现一个光线追踪渲染器。以这个形式,你能通过学习一门新的(而且漂亮的)语言来加深对编程语言设计、编译原理的理解,同时又能趣味性地了解Computer Graphics的基础工作。

今年我们增设了作品互评环节。使用自己手写的渲染器,发挥艺术才能,创造出惊艳全场的超现实大作吧!

主要参考资料如下:

更多的参考资料信息在下方的Reference版块中。

你可以直接点击右上角的“Use this template”将这个项目复制到自己的 GitHub Profile 中。接下来,你需要做一些准备工作。

Task 0: Preparation

  • raytracer/Cargo.toml 中,修改作者信息。
  • LICENSE 中,将作者修改为自己。你也可以换成其他许可证。
  • 使用 rustup 安装 Rust。如果下载速度很慢,可以考虑使用 SJTUG Mirror 的 rust-static 和 crates.io 镜像。
  • 之后,你需要安装一些工具。首先,你需要定位到项目目录。而后,运行 rustup component add clippy rustfmt
  • 接着,运行 make ci。如果程序可以正常运行,那么环境就已经配置成功了。
  • 将这些更改 push 到 GitHub 上。在 GitHub Action 中,“Lint and Test”和“Build and Upload”都应当通过。
  • 程序生成的结果会出现在 GitHub Action 的 artifacts 中。output 文件夹下的内容应当是程序运行时生成的。 对 output 文件夹的修改不应该被同步到 GitHub 上(这个文件夹在 .gitignore 中有设置,会被 git 忽略)。
  • 最后,你可以把 README.md 的教程部分删除,换成自己程序的描述、运行方法等信息。

Task INF: Learn about Rust

我们希望在前一周的时间让大家熟悉Rust的语法。请阅读Rust书(或者你认为合适的教程)学习。

  • 通常来说,你只需要用到前 6 章和第 10.2 节的内容。
  • 如果碰到了 lifetime 相关的问题,请仔细阅读第 4 章,特别是 4.2 的例子。
  • 当然,你也可以通过第 15 章中的智能指针解决一部分 lifetime 导致的问题。
  • Rust 的面向对象特性(trait,对应 C++ 的类)可以在 10.2 中找到。
  • (Advanced)涉及到多线程渲染时,你可以阅读第 15、16 章的内容。

Task 1: One Weekend

  • Ray Tracing book 1,轻巧的一个周末。

  • code review(60pts for 工科,30pts for ACM):第二周周一。

    • book 1相关细节
    • Rust特性掌握(简易,不超出要求章节外)

Task 2: Next Week

  • Ray Tracing book 2

  • 多线程渲染

  • code review (仅工科,35pts for 工科&ACM):第二周周五下午3点

    • 必须完成部分(20pts,未做完不得分):BVH、Rectangles and Lights;其余部分视完成情况给分,封顶为book 2全部完成 + 多线程渲染。

    • book 2实现部分的相关细节,尤其是BVH部分,请务必尝试搞懂!

    • 工科同学结课 🎉 作品互评 🤯

Task 3: Rest of Your Life & Extra work

  • Ray Tracing book 3(20pts for ACM)

  • Advanced features(Bonus, 10pts for ACM)

    • 完成3项track即可拿满
    • 如果你手写实现了obj_loader(没有调包),只要完成2项(包括Track 7)即拿满
  • code review:第四周周五

    • book 3相关细节
    • advanced features相关细节
    • ACM班同学结课 🎉 作品互评 🤯 (5pts for ACM)

Advanced features

  • Track 1: Reduce Contention 此项工作的前提条件是完成多线程渲染。在多线程环境中,clone / drop Arc 可能会导致性能下降。因此,我们要尽量减少 Arc 的使用。这项任务的目标是,仅在线程创建的时候 clone Arc;其他地方不出现 Arc,将 Arc 改为引用。

  • Track 2: Static Dispatch 调用 Box / Arc / &dyn trait 中的函数时会产生额外的开销。我们可以通过泛型来解决这个问题。

    • 这个任务的目标是,通过定义新的泛型材质、变换和物体,比如 LambertianStatic,并在场景中使用他们,从而减少动态调用的开销。你也可以另开一个模块定义和之前的材质同名的 struct。
    • 你可以在 material.rs 里找到泛型的相关用法。
    • 仅在 HitRecord, ScatterRecord (这个在 Rest of Your Life 的剩余部分中出现), HittableListBVHNode 中使用 dyn
    • 如果感兴趣,可以探索如何使用 macro_rules 来减少几乎相同的代码写两遍的冗余。
  • Track 3: Code Generation 此项工作的前提条件是完成 BVH。

    • 目前,BVHNode 是在运行时构造的。这个过程其实可以在编译期完成。我们可以通过过程宏生成所有的物体,并构造静态的 BVHNode,从而提升渲染效率。
    • raytracer_codegenraytracer大概是不能共用module的,你可能需要把一些实现(如Vec3)简单地copy到raytracer_codegen下。
    • 你可以使用 cargo expand 来查看过程宏处理过后的代码。你也可以在编译过程中直接输出过程宏生成的代码。
    • codegen 部分不需要通过 clippy。
    • 如果感兴趣,你也可以探索给过程宏传参的方法。e.g. 通过 make_spheres_impl! { 100 } 生成可以产生 100 个球的函数。
  • Track 4: PDF Static Dispatch 此项工作的前提条件是完成 Rest of your Life 的剩余部分。PDF 中需要处理的物体使用泛型完成,去除代码路径中的 &dyn

  • Track 5: More Code Generation 在过程宏中,读取文件,直接从 yaml 或 JSON 文件(选择一种即可)生成场景对应的程序。

    • data 文件夹中给出了一些例子。
    • 例子中 BVHNode 里的 bounding_box 是冗余数据。你可以不使用这个数据。
    • 读 JSON / yaml 可以调包。
  • Track 6: Advanced Features 增加对 Transform 的 PDF 支持。

  • 如果你有多余的时间,你可以通过 benchmark 来测试实现功能前后的区别。

    • 完成 Track 3 前请备份代码 (比如记录 git 的 commit id)。完成 Track 4, 5, 6 时请保留原先的场景和程序,在此基础上添加新的内容。
    • 你可以使用 criterion crate 做 benchmark。benchmark 的内容可以是往构造好的场景中随机打光线,记录打一条光线所需的时间。
  • Track 7: Support for .obj 支持载入obj文件并渲染。完成这一部分你可能需要:

    • 了解obj文件格式
    • 实现一个obj_loader
      • 可调包,如tobj
      • OBJ文件格式和tobj可参考参考资料或自行搜索
    • 实现对简单多边形的渲染
    • 支持obj可以让你最后的大作更精彩哦 :) 图源参考资料↓

    Rust logo with friends

More Information

Makefile

Makefile 中包含了运行 raytracer 的常用指令。如果没有安装 make,你也可以直接运行 cargo balahbalah

  • make fmt 会自动格式化所有的 Rust 代码。
  • make clippy 会对代码风格做进一步约束。
  • make test 会运行程序中的单元测试。你编写的 Vec3 需要通过所有测试。
  • make run_release 会运行优化后的程序。通常来说,你需要用这个选项运行 raytracer。否则,渲染会非常慢。
  • make run 以 debug 模式运行程序。
  • make ci = fmt + clippy + test + run_release。建议在把代码 push 到远程仓库之前运行一下 make ci

GitHub Action

这个仓库已经配置好了 GitHub Action。只要把代码 push 到远程仓库,GitHub 就会进行下面两个检查。

  • Lint and Test 会运行所有单元测试,并检查代码风格。
  • Build and Upload 会运行优化后的程序,并将 output 目录下生成的文件传到 build artifacts 中。

Reference

You might also like...
clone of grep cli written in Rust. From Chapter 12 of the Rust Programming Language book

minigrep is a clone of the grep cli in rust Minigrep will find a query string in a file. To test it out, clone the project and run cargo run body poem

The Rust Compiler Collection is a collection of compilers for various languages, written with The Rust Programming Language.

rcc The Rust Compiler Collection is a collection of compilers for various languages, written with The Rust Programming Language. Compilers Language Co

Game Boy Emulator written in Rust, as a way to fully grasp the Rust programming language

Flan's Game Boy Emulator Game Boy Emulator written in Rust, as a way to get hands-on with the Rust programming language, and creating a proper project

Nixt is an interpreted programming language written in Rust

Nixt Nixt is an interpreted lisp inspired programming language written in Rust Index About Examples Installation Build About Nixt goal is to provide a

Fegeya Elitebuild, small, powerful build system. Written in Rust.
Fegeya Elitebuild, small, powerful build system. Written in Rust.

Fegeya Elitebuild Small, powerful, work-in-progress build system. Written in Rust. Features: No functions (all are built-ins) All variables are global

An i386 operation system written in pure rust for fun and no profit.

OrustS An i386 operation system written in pure rust (for fun and no profit). This operation system is under active developing. Checklist implement a

A tool to make grocery lists written in Rust

grusterylist: makes grocery lists, written in Rust grusterylist uses and can add to local libraries of user-added recipes and grocery items to put tog

Tests a wide variety of N64 features, from common to hardware quirks. Written in Rust. Executes quickly.

n64-systemtest Tests a wide variety of N64 features, from common to hardware quirks. Written in Rust. Executes quickly. n64-systemtest is a test rom t

DWARF packaging utility, written in Rust, supporting GNU extension and DWARF 5 package formats.

thorin thorin is an DWARF packaging utility for creating DWARF packages (*.dwp files) out of input DWARF objects (*.dwo files; or *.o files with .dwo

Owner
For more information please reread.
null
A comprehensive and FREE Online Rust hacking tutorial utilizing the x64, ARM64 and ARM32 architectures going step-by-step into the world of reverse engineering Rust from scratch.

FREE Reverse Engineering Self-Study Course HERE Hacking Rust A comprehensive and FREE Online Rust hacking tutorial utilizing the x64, ARM64 and ARM32

Kevin Thomas 98 Jun 21, 2023
Rust serenity korean tutorial

?? 러스트 Serenity 디스코드 API 강좌 반갑습니다. 러스트 Serenity 디스코드 API 강좌에 오신것을 진심으로 환영합니다 ! Serenity는 러스트로 짜여진 디스코드 API 입니다. 독자 여러분들은 discord.py 를 해보셨습니까? 만약, disc

Fn79 3 Dec 17, 2021
LLVM tutorial in Rust language

Status Everything works. State corresponds to the Chapter 7 of the original tutorial (i.e. mutable variables implemented). TODO list. LLVM tutorial in

Jauhien Piatlicki 944 Dec 28, 2022
An RPC framework developing tutorial

Mini Lust 系列教程 好奇如何从零造出来一个 RPC 框架?本教程将带你一步一步写出来一个 Rust 版 Thrift RPC 框架。 教程说明 从第二章开始每章节都会附带代码。 这个代码是在上一章节的基础上写的,文档里一般会告诉你增加了哪些东西,但是如果你想详细地对比到底哪里变动了,可以自

null 454 Dec 30, 2022
Tutorial for parsing with nom 5.

Nom Tutorial Nom is a wonderful parser combinators library written in Rust. It can handle binary and text files. Consider it where you would otherwise

Benjamin Kay 265 Dec 11, 2022
A tutorial of building an LSM-Tree storage engine in a week! (WIP)

LSM in a Week Build a simple key-value storage engine in a week! Tutorial The tutorial is available at https://skyzh.github.io/mini-lsm. You can use t

Alex Chi 870 Jan 3, 2023
Roadmap to becoming a Rust Web Developer in 2021

Roadmap to becoming a Rust Web Developer in 2021

Anshul Goyal 1.4k Jan 4, 2023
Voluntarily contributed solutions for the first practical exercise for the Compilerbau lecture WiSe 2021/2022 of Ulm University

Solutions for the first practical exercise Compilerbau lecture WiSe 2021/2022 - Ulm University Contributing Want to add your solution? Great! Just add

null 5 Dec 4, 2021
Simple autoclicker written in Rust, to learn the Rust language.

RClicker is an autoclicker written in Rust, written to learn more about the Rust programming language. RClicker was was written by me to learn more ab

null 7 Nov 15, 2022
Rust programs written entirely in Rust

mustang Programs written entirely in Rust Mustang is a system for building programs built entirely in Rust, meaning they do not depend on any part of

Dan Gohman 561 Dec 26, 2022