[CG] TinyRenderer 学习记录(0):初始化
引言
最近在上学校开设的《计算机图形学研究进展 / Advances in Computer Graphics》,打算同步学习 GAMES202……听起来非常美好,但我突然发现一件恐怖的事情——自己图形学的基础知识都忘得差不多了!
因此我决定跟着 TinyRenderer 的教程做一遍,当作图形学的复习。
你不会在本学习记录中看到的东西
原理与实现
因为是复习,所以本学习记录不会涉及太多原理方面的内容,侧重于代码上的实现。如果你对原理感兴趣,推荐观看 GAMES101 。
性能优化
性能上的优化常常伴随着代码可读性的降低(在不加注释的情况下)。为了代码的可读性,我会尽量少地使用优化。举个例子,比如二维向量的表示既可以通过 np.array
实现,也可以用两个变量 x1
x2
来做,而且运算效率可能更高,但我会选择前者,因为它更贴近数学意义上的描述。
环境配置
原作者使用的是 C++,也是我最常用的语言——不过这次我打算使用 Python。仅仅是渲染单张图像的话,其实两者的效率差异在感官上并不是很大,而且后者无论在库的种类还是在库的配置、引入难度上都要明显优于前者,我认为选择 Python 可以让我更专注于教程本身。
进度安排
原教程共有十节课。第一节非常短,属于绪论性质的东西,剩下九节课,我初步打算是保持两天内一节的速度推进。
初始化
进入正题。接下来做这三件事:
- 创建图像
- 显示图像
- 修改图像(修改像素)
因为代码非常简单,所以直接放在下面:
# main.py from Renderer import Renderer from random import uniform import math renderer = Renderer(100, 100) for x in range(100): color = [uniform(0.0, 1.0) for _ in range(3)] renderer.setPixel(x, 49 * (math.sin(2 * 3.141592653 * 1 / 50 * x) + 1), color) renderer.render()
# Renderer.py import matplotlib.pyplot as plt import numpy as np class Renderer: def __init__(self, width, height): self.__imgWidth = width self.__imgHeight = height self.__img = np.ones((height, width, 3)) def render(self): plt.imshow(self.__img) plt.show() # low-level operations def setPixel(self, x, y, color): self.__img[int(y)][int(x)] = color
这里需要注意的是创建图像时 width
和 height
的顺序是反过来的,修改图像时 x
和 y
的顺序也是如此,这是因为我们创建矩阵时通常先指定其行数(height),再指定其列数(width)。
运行上述代码(main.py)的效果如下:
由于我们的 renderer 目前只能画点,所以曲线看起来是不连续的。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)