【Ray-Tracing In One Weekend】第6章 反走样

本文介绍了非实时系统中光线追踪的反走样技术。通过对每个像素增加100个采样点求平均实现反走样,对比显示边缘反走样效果明显。还阐述了反走样原理,即对数据周围范围采样多个点求平均值,同时对camera进行了封装,也提及可减少采样次数提高效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在非实时系统当中,反走样不得不依靠针对单个像素的多重采样,在本文以前的第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个示例 递归反射、抗锯齿

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值