[0.1] - 光线追踪 (Ray Tracing)
简介
今天我们将通过编写一个基本的图形渲染器来练习 PyTorch 中的矩阵批量运算 (batched matrix operations). 我们将从一个极简化的案例开始,然后逐步渲染你自己的 3D 皮卡丘!
我们在今天也会讨论一些更通用更重要的主题,例如:
- 使用 GPT 来辅助 coding 和学习.
- 类型检查和良好的 coding 习惯.
- Debug, 和使用 VSCode 内置的运行与调试功能.
主要内容 & 学习目标
射线和线段 (Rays & Segments)
本节中介绍今天练习的关键思想和概念,并指导完成一些涉及创建和使用 2D 射线的基本功能.
学习目标
批量操作 (Batched Operations)
在下一节,你将把你在第一节完成的任务拓展成批量操作,即一次在多个不同维度上进行操作.
学习目标
三角形 (Triangles)
在最后一节,我们将进入 2 维和 3 维领域,并逐步将完整的 3 维网络渲染为 2 维图像.
学习目标
彩蛋 (Bonus)
在可选的彩蛋练习中,你可以了解到 pytest
库,以及实现数学上更复杂的光线追踪形式,来得到动态照明和视频等等.
开始准备 (Setup)
请先运行以下代码 (不用通读理解他.)
python
import os
import sys
import torch as t
from torch import Tensor
import einops
from ipywidgets import interact
import plotly.express as px
from ipywidgets import interact
from pathlib import Path
from IPython.display import display
from jaxtyping import Float, Int, Bool, Shaped, jaxtyped
import typeguard
# Make sure exercises are in the path
chapter = r"chapter0_fundamentals"
exercises_dir = Path(f"{os.getcwd().split(chapter)[0]}/{chapter}/exercises").resolve()
section_dir = exercises_dir / "part1_ray_tracing"
if str(exercises_dir) not in sys.path: sys.path.append(str(exercises_dir))
from plotly_utils import imshow
from part1_ray_tracing.utils import render_lines_with_plotly, setup_widget_fig_ray, setup_widget_fig_triangle
import part1_ray_tracing.tests as tests
MAIN = __name__ == "__main__"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
帮助-在VSCode里,我在类似de part1_ray_tracing.utils
语句下面看到了黄色波浪线警告.
这是因为VSCode的类型检查器不知道去那里解析本地导入库.解决这个问题请遵循以下步骤:
Ctrl + Shift + P
打开命令面板(或者在mac上使用Cmd + Shift + P
)Preference: Open Workspace Settings (JSON)
选项(中文为首选项: 打开工作区设置(JSON)
){
"python.analysis.extraPaths": [
"${workspaceFolder}/chapter0_fundamentals",
"${workspaceFolder}/chapter0_fundamentals/exercises",
],
}
确保这是"python.analysis.extraPaths"
中的唯一内容(其他内容需要注释掉).当你学习后面的章节时,你需要对此进行相应的修改.
有关pathlib
的笔记
我们将使用pathlib
库来定义文件路径.这是比os
库更现代的文件路径处理方法,并且更支持跨平台.你可以在这里阅读到更多有关信息.
使用pathlib
而不是相对路径的一个主要优点是,他对于你恰好在其中运行代码的文件/目录更加可靠.没有什么比导入或加载文件失败更令人沮丧的了,尤其是你还能看到他就在你的当前目录下面!我们加载文件的大多数代码看起来像这样:
with open(section_dir / "pikachu.pt", "rb") as f:
triangles = t.load(f)
因为section_dir
是part1_ray_tracing
的目录名.正斜杠用于定义该目录中的文件和目录.