工科和ACM的朋友们都已结课!看看这些了不起的艺术品:
ACM伪摄影公司,简称PPCA,于2021年成立😉
这个项目的主要工作是使用Rust语言实现一个光线追踪渲染器。以这个形式,你能通过学习一门新的(而且漂亮的)语言来加深对编程语言设计、编译原理的理解,同时又能趣味性地了解Computer Graphics的基础工作。
今年我们增设了作品互评环节。使用自己手写的渲染器,发挥艺术才能,创造出惊艳全场的超现实大作吧!
主要参考资料如下:
更多的参考资料信息在下方的Reference版块中。
你可以直接点击右上角的“Use this template”将这个项目复制到自己的 GitHub Profile 中。接下来,你需要做一些准备工作。
raytracer/Cargo.toml
中,修改作者信息。LICENSE
中,将作者修改为自己。你也可以换成其他许可证。rustup component add clippy rustfmt
make ci
。如果程序可以正常运行,那么环境就已经配置成功了。.gitignore
中有设置,会被 git 忽略)。我们希望在前一周的时间让大家熟悉Rust的语法。请阅读Rust书(或者你认为合适的教程)学习。
Ray Tracing book 1,轻巧的一个周末。
[x] code review(60pts for 工科,30pts for ACM):第二周周一。
Ray Tracing book 2
多线程渲染
[x] code review (仅工科,35pts for 工科&ACM):第二周周五下午3点
必须完成部分(20pts,未做完不得分):BVH、Rectangles and Lights;其余部分视完成情况给分,封顶为book 2全部完成 + 多线程渲染。
book 2实现部分的相关细节,尤其是BVH部分,请务必尝试搞懂!
工科同学结课🎉 作品互评🤯
Ray Tracing book 3(20pts for ACM)
Advanced features(Bonus, 10pts for ACM)
[x] code review:第四周周五
Box<dyn trait>
/ Arc<dyn trait>
/ &dyn trait
中的函数时会产生额外的开销。我们可以通过泛型来解决这个问题。
LambertianStatic<T>
,并在场景中使用他们,从而减少动态调用的开销。你也可以另开一个模块定义和之前的材质同名的 struct。material.rs
里找到泛型的相关用法。HitRecord
, ScatterRecord
(这个在 Rest of Your Life 的剩余部分中出现), HittableList
和 BVHNode
中使用 dyn
。macro_rules
来减少几乎相同的代码写两遍的冗余。BVHNode
是在运行时构造的。这个过程其实可以在编译期完成。我们可以通过过程宏生成所有的物体,并构造静态的 BVHNode
,从而提升渲染效率。raytracer_codegen
和raytracer
大概是不能共用module的,你可能需要把一些实现(如Vec3
)简单地copy到raytracer_codegen
下。cargo expand
来查看过程宏处理过后的代码。你也可以在编译过程中直接输出过程宏生成的代码。codegen
部分不需要通过 clippy。make_spheres_impl! { 100 }
生成可以产生 100 个球的函数。&dyn
。data
文件夹中给出了一些例子。BVHNode
里的 bounding_box
是冗余数据。你可以不使用这个数据。criterion
crate 做 benchmark。benchmark 的内容可以是往构造好的场景中随机打光线,记录打一条光线所需的时间。Track 7: Support for .obj 支持载入obj文件并渲染。完成这一部分你可能需要:
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。只要把代码 push 到远程仓库,GitHub 就会进行下面两个检查。