【GAMES 101】作业7的实现和思考

本文档详细记录了在Scene.cpp中实现Path Tracing算法的过程,包括castRay函数的编写,以及如何根据光源进行采样和计算概率密度。作业要求在场景中求光线与物体的交点,并考虑不同材质的出射方向采样。在绘制结果中展示了只有直接光和间接光的情况,分析了原有代码的问题并进行了修正。作者在完成作业后表达了对图形学学习的感慨和未来的期待。

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


本文为闫令琪老师的GAMES 101课程的作业7的个人实现,文中如有错漏欢迎指出。

作业要求

  • castRay(const Ray ray, int depth)in Scene.cpp: 在其中实现 Path Tracing 算法

可能用到的函数:

  • intersect(const Ray ray)in Scene.cpp: 求一条光线与场景的交点

  • sampleLight(Intersection pos, float pdf) in Scene.cpp: 在场景的所有光源上按面积 uniform 地 sample 一个点,并计算该 sample 的概率密度

  • sample(const Vector3f wi, const Vector3f N) in Material.cpp: 按照该材质的性质,给定入射方向与法向量,用某种分布采样一个出射方向

  • pdf(const Vector3f wi, const Vector3f wo, const Vector3f N) in Material.cpp: 给定一对入射、出射方向与法向量,计算该出射方向的概率密度

  • eval(const Vector3f wi, const Vector3f wo, const Vector3f N) in Material.cpp: 给定一对入射、出射方向与法向量,计算这种情况下的f_r

代码实现

Path Tracing的理论知识,在此不多赘述。下图为作业文档中提供的伪代码,我们要做的就是把它写成C++代码:

在这里插入图片描述

castRay

// Implementation of Path Tracing
Vector3f Scene::castRay(const Ray &ray, int depth) const
{
   
   
    Vector3f L_dir, L_indir;
    // TODO Implement Path Tracing Algorithm here
    // ray and scene intersect at p
    Intersection inter_p = intersect(ray);

    if (!inter_p.happened)
    {
   
   
        return Vector3f();
    }
    if (inter_p.m->hasEmission())
    {
   
   
        return inter_p.m->getEmission();
    }

    Vector3f& p = inter_p.coords;
    Vector3f& N = inter_p.n
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值