🗒️GAMES101 作业2
type
status
date
slug
summary
tags
category
icon
password
最近有意向的公司接连开奖,让人难以静下心来学习,各种薪资、总包刺激眼球。
但还是要慢慢学习进步,step by step。
引言
本次的作业要完成两个函数:
insideTriangle(int x, int y, const Vector3f* _v)
rasterize_triangle(const Triangle& t)
这次的作业任务明显是需要搞清三角形光栅化过程。
三角形作为最基本的图元,搞清楚它的光栅化过程还是很有必要的。
代码
三角形与坐标点的判定
通常来讲,我们用两个整数 (x,y) 代表像素的坐标值。
对于这个问题,我选择向量叉乘法来判定像素点是否在三角形内部。
当然会有一些边界情况,如果像素点落在三角形的边上,我选择将其视作为三角形内。
光栅化 & 深度检测
在这一步,需要实现
rasterize_triangle(const Triangle& t)
函数,分为三个步骤:- 界定三角形的 bounding box,确定需要判定的像素点的范围。
- 枚举 bounding box 内的像素点,看是否在三角形内部。
这一步骤需要用到之前的
insideTriangle(int x, int y, const Vector3f* _v)
函数。
- 对于在三角形内部的像素点,根据它的深度,确认是否需要在对应像素值进行渲染。
Bounding Box
根据作业引导,这里直接使用bb去确认三角形的范围(总不能整张图都枚举一遍吧?)
思路很简单,分别找到x与y的最值,就可以界定像素点范围。
枚举像素点,判断是否在三角形内部
已知bb的范围,写出枚举循环当然是非简单的过程。
边界条件是一些老生常谈的问题,
int
类型的数据范围对于像素值的枚举而言也完全足够。注意这里直接传入
t.v
,利用数组与指针自动转换的特点。当然,使用
std::array
明显是更合适的选择。深度插值 & 渲染
关于深度,代码框架已经给出了计算的方法,相当于我们可以直接得到某个像素点的深度值
z_interpolated
。那我们需要做的事情就非常简单了。
总结
代码的运行结果如下
与作业中预期的结果一致。
需要注意的是,代码框架中将z值做了处理,使更大z代表跟大的深度(别忘了,我们看向的是-z)。
上一篇
View(MVPV)变换
下一篇
GAMES101 作业1
- Twikoo