[CG] TinyRenderer 学习记录(0):初始化

Repo

引言

最近在上学校开设的《计算机图形学研究进展 / 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

这里需要注意的是创建图像时 widthheight 的顺序是反过来的,修改图像时 xy 的顺序也是如此,这是因为我们创建矩阵时通常先指定其行数(height),再指定其列数(width)。

运行上述代码(main.py)的效果如下:
image

由于我们的 renderer 目前只能画点,所以曲线看起来是不连续的。

posted @   ZXPrism  阅读(40)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示