3d 到 2d 的转换

前言:图形学第三弹,这可能是一个最简单的 3d 到 2d 的转换算法。

先上图

之前我们只是将所有的三角形画了出来,没有考虑哪些点应该在前面、哪些点应该在后面

也就是说,z 大的点应该遮住 z 小的点。

所以难点就是,我们只知道三角形的边,而不知道三角形内部点的 z 的大小

上一篇文章的最后一部分,我们换了一个思路去画填充三角形。

我们可以通过重心法求出某点是否在这个三角形里面。重心法计算了的 u,v 值。

假设 ABC 是三角形的三个顶点,P 点是待计算的点
\vec{PA} + u\vec{AB} + u\vec{AC} = 0

这个值同样可以用来计算 z 的大小。

代码(不完全)

// pts[i][2] 是 z 的值。
// bc_screen[i] 分别是计算出的参数
for (int i=0; i<3; i++) P.z += pts[i][2]*bc_screen[i];
// 计算后就可以得到 z 的值

叙述整个算法

  • 假设图片大小是 width × height。也就是有width × height 个像素。

  • 用 zbuffer[width × height] 存储每一个要画像素的 z 值,初始化为无穷小

  • 输入三角形的三条边,遍历三角形内部的所有点。如果内部点的 z 大于zbuffer 的值更新 zbuffer 并画点。达到在上面的像素覆盖之前像素的目的。

  • 重复上述操作,直到遍历完所有的三角形

完整代码

GitHub

最后实现渲染器的代码

参考

这是大神

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容