🗒️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) 函数,分为三个步骤:
  1. 界定三角形的 bounding box,确定需要判定的像素点的范围。
  1. 枚举 bounding box 内的像素点,看是否在三角形内部。 这一步骤需要用到之前的insideTriangle(int x, int y, const Vector3f* _v) 函数。
  1. 对于在三角形内部的像素点,根据它的深度,确认是否需要在对应像素值进行渲染。

Bounding Box

根据作业引导,这里直接使用bb去确认三角形的范围(总不能整张图都枚举一遍吧?)
思路很简单,分别找到x与y的最值,就可以界定像素点范围。

枚举像素点,判断是否在三角形内部

已知bb的范围,写出枚举循环当然是非简单的过程。
边界条件是一些老生常谈的问题,int 类型的数据范围对于像素值的枚举而言也完全足够。
注意这里直接传入 t.v ,利用数组与指针自动转换的特点。
当然,使用 std::array 明显是更合适的选择。

深度插值 & 渲染

关于深度,代码框架已经给出了计算的方法,相当于我们可以直接得到某个像素点的深度值 z_interpolated
那我们需要做的事情就非常简单了。

总结

代码的运行结果如下
notion image
与作业中预期的结果一致。
需要注意的是,代码框架中将z值做了处理,使更大z代表跟大的深度(别忘了,我们看向的是-z)。
 
上一篇
View(MVPV)变换
下一篇
GAMES101 作业1
Loading...