QA From TinyRenderer&TinyRenderer问题汇总

发布时间 2023-08-27 21:31:24作者: xkyl

最近在学习TinyRenderer这个库,包括学习这个库本身的wiki以及一些知乎上的内容。遇到的问题在这里记录一下。
git:https://github.com/xkyl-yhw/SoftRenderer

库文件混乱,使用的版本不同.以及函数不统一的问题

比较经典的就是本身tinyrenderer在一开始教学为了区分vec和vec,于是就有一开始功能比较简单,但比较具体的第一版头文件。其中有对Vec2i/Vec2f 、Vec3i/Vec3f进行区分。和库的第二版(可能是?我是重写的第二版用这个库里面的头文件,然后增加一些功能)最终版本直接使用vec2/vec3不同,当然后面也有统一。为此我分别把第一版Version1和第二版Version2上传到git上。

normalize()函数

其中函数不统一的比较经典的就是vec的normalize()函数,第一版的标准化函数是直接应用在vec上的,而第二版则是返回一个标准化vec。
具体可以直接看返回值,前者是vec<2>,是第二版的定义。后者返回值是vec<2>& 是我仿造第一版新增在第二版的定义。

uv坐标

第一版的uv坐标会乘以texture图片大小,而第二版的不会,直接返回uv坐标。

图片输出后出现的破面,缺点

这个问题是初学一开始经常会遇到的问题。可能出现在各个阶段。这里个人对光栅化阶段的两种方式进行分析,我们在画三角形的过程中可能采用的是线扫描或者包围盒的方式进行像素填充,重点是像素填充的一定是整形,就是光栅化阶段所确定的包围盒的区域也好,线扫描的上下左右区间也罢。一定是整型范围,你可以通过floor/ceil稍微扩大范围,或者用int(float + 0.5)进行float到int的转换。
可能有以下原因:

  • 这个与上面版本不清楚有关系,导致需要对函数进行改写,不能粗暴的更换头文件。
  • float精度有关
  • vec 和 vec 之间的转换有关。

float精度

精度问题主要是在 https://zhuanlan.zhihu.com/p/523501661 这里最后有提及

增大改变重心坐标函数返回的坐标精度。

vec 和 vec 之间的转换有关。

建议一定看清楚函数参数输入的是Vec3还是Vec3. 如果使用最终版本我建议增加一个把vec3的值转成整数的函数。

Reference:
https://github.com/ssloy/tinyrenderer
https://www.zhihu.com/column/c_1515686815151034369
https://github.com/xkyl-yhw/SoftRenderer