QA From TinyRenderer&TinyRenderer问题汇总

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

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

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

normalize()函数

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

uv坐标

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

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

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

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

float精度

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

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

vec\(<\)float>和 vec\(<\)int\(>\) 之间的转换有关

建议一定看清楚函数参数输入的是Vec3\(<\)int\(>\)还是Vec3\(<\)float\(>\).不管是线扫描还是包围盒的方式,一般采取在输入前转整型或者确定范围后转整型。
一样分成两种版本,第一个版本出现转换主要是在光栅化时,包围盒的范围需要转整型,整型的范围则是上下取值。(当然第一个版本包围盒可能float也能过)

如果使用第二个版本,我建议增加一个把vec3的值转成整数的函数。可以在输入前转整型以及是确定范围后根据源代码是不是Vec3i进行转整型。第一个版本中作者有添加Vec3i和Vec3f互转的构造函数,也是为了这个情况。

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

posted @ 2023-08-27 21:28  xkyl  阅读(16)  评论(0编辑  收藏  举报