在非实时系统当中,反走样不得不依靠针对单个像素的多重采样,在本文以前的第0-5章,数据都是秒生成完的,但是自从这一章针对每个像素增加100个采样点求平均之后,debug就要一会儿才出结果。这才哪跟哪。
先说本章在【Ray-Tracing In One Weekend】第5章 添加球体表面法线和多个物体之上的加的反走样的对比效果:
左侧是第5章的效果,右侧是本章的效果。可以看出边缘的反走样效果明显。
本章代码:
链接:https://pan.baidu.com/s/1PJ4vWj67TwBGNTHGZzbFTQ
提取码:99ny
【本章反走样原理】
原本是对一个数据进行采样,现在要对这个数据周围范围[0, 1]像素之内的100个点进行采样,这100个点的选取当前是使用随机数drand48(), 其会返回一个0到1之间的随机数。
本来要采一个点的,现在要采多个点求平均值。
本章还对camera进行了封装。关于多次采样的代码如下
camera cam;
for (int j = ny - 1; j >= 0; j--)
{
for (int i = 0; i < nx; i++)
{
vec3 col(0, 0, 0);
for (int s = 0; s < ns; s++)
{
float u = float(i + drand48()) / float(nx);
float v = float(j + drand48()) / float(ny);
ray r = cam.get_ray(u, v);
col += color(r, world);
}
col /= float(ns);
int ir = int(255.99 * col[0]);
int ig = int(255.99 * col[1]);
int ib = int(255.99 * col[2]);
outputFile << ir << " " << ig << " " << ib << "\n";
}
}
注意这里凭空多出来个循环ns,其中ns=100,当然我们可以减少采样次数来提高效率,但是也是无法接受的。针对实时的光线追踪系统则没有这个问题。可以参见【OptiX】第5个示例 递归反射、抗锯齿。