铝蜂窝板关键词:三角形冲孔网
标题:渲染器 2 —— 三角形的光栅化
来源:知乎
铝蜂窝板
文章内容: 续上两篇
我开了一个 Python 的项目,目的是为了简化代码的编写,渲染器大部分都是算法,重在讲解作用,用 Python 写虽然运行慢,但是写起来快,省心省力。
用 C++ 的同学也可以根据代码轻松改写成 C++(并且已有一个成型的 C++ 版本在前)。
喜欢汉编的同学可以参考以下链接。
能不能设计出一个终极傻瓜编程软件,让普通人可以完美编程? - 知乎用户的回答
Python 版本仓库如下
guaxiao/rasterizer.py · GitHub
C++ 版本在此两篇文章中
渲染器 0 —— 准备工作 - 炼瓜研究所 - 知乎专栏
渲染器 1 —— 基本绘图 - 炼瓜研究所 - 知乎专栏
概要
仓库中的现阶段代码及其说明如下:
本文主要讲三点
直线
三角形
颜色插值
直线
「光栅」就是「像素」,铝蜂窝板光栅化就是像素化。屏幕是由独立的像素组合而成,绘图皆为近似模拟。
参照下图,根据斜率的不同,直线算法可分为两种。请自行动手,或看书、或搜索资料、或直接看代码实现。
额外的,直线还应该进行裁剪(Line clipping),我并没有做这一步,留作练习。
三角形
先将三角形三个顶点按 Y 坐标排序,使得 a.y > b.y > c.y。
a, b, c = sorted([v1, v2, v3], key=lambda k: k.position.y)
对 AC 边求得点 M(m.y == b.y),三角形就被划分成了 AMB、MBC 两个三角形。
已知 A M B 三点坐标,从 p1.y 到 p2.y,分别求出 sx,ex,填充像素。M B C 同理可填充。铝蜂窝板
需要说明的一点是,M B 可能会交换位置,书上或者你检索到的资料中可能会分两种情况来处理,不过请看我的代码,这个问题一个循环简单明了,三角形至此就填充完毕。
sign = 1 if x2 > x1 else -1 for x in range(x1, x2 + sign * 1, sign):
颜色插值
颜色插值的原理也简单,上面所说的三角形光栅化时,对颜色也进行插值计算即可。
额外的,以下是老一代的抗锯齿基本原理,如果时间充沛可自行查阅资料实现,比如20年前的吴小林算法、多重取样(MSAA)等等。
完
2D 的内容到此为止,接下来就要步入 3D 世界了。
在此之前你可能会问为什么是画三角形,铝蜂窝板因为三角形是组成平面的基本元素,一个矩形可以由两个直角三角形拼接而成,类推。
当然世嘉也出过以四边形为基本图元的土星(SS(Sega Saturn))主机
不过这也是 20 多年前的事了
另
有问题请评论,脸皮薄可私信铝蜂窝板