GAMES101:作业7

本博客介绍了GAMES101课程作业7的内容,涉及Path Tracing算法的实现。在之前的作业基础上,需要拷贝并修改Ray-Triangle相交、包围盒与光线相交以及BVH查找的函数。重点在于处理相等时的边界条件,以避免渲染异常。作业要求在Scene.cpp的castRay函数中实现Path Tracing,并使用场景交互、光源采样、材质属性等函数。最终,博主展示了渲染效果,强调Russian Roulette概率对结果的影响。
摘要由CSDN通过智能技术生成

GAMES101:作业7

附其他所有作业超链接如下:
Games101 作业0:作业0
Games101 作业1:作业1
Games101 作业2:作业2
Games101 作业3:作业3
Games101 作业4:作业4
Games101 作业5:作业5
Games101 作业6:作业6
Games101 作业7:作业7

完整代码获取途径:
https://github.com/liupeining/Games_101_homework

“在之前的练习中,我们实现了 Whitted-Style Ray Tracing 算法,并且用 BVH等加速结构对于求交过程进行了加速。在本次实验中,我们将在上一次实验的基础上实现完整的 Path Tracing 算法。至此,我们已经来到了光线追踪版块的最后一节内容。”

修改的内容:
你需要从上一次编程练习中直接拷贝以下函数到对应位置:
• Triangle::getIntersection in Triangle.hpp: 将你的光线-三角形相交函数粘贴到此处,请直接将上次实验中实现的内容粘贴在此。

/*inline 函数仅仅是一个对编译器的建议,所以最后能否真正内联,看编译器的意思,
它如果认为函数不复杂,能在调用点展开,就会真正内联,并不是说声明了内联就会内联,声明内联只是一个建议而已。
为了解决一些频繁调用的小函数大量消耗栈空间(栈内存)的问题,特别的引入了 inline 修饰符,表示为内联函数。
栈空间就是指放置程序的局部数据(也就是函数内数据)的内存空间。
*/
inline Intersection Triangle::getIntersection(Ray ray)
{
   
    Intersection inter;
    //如果结果大于0,那么这两个向量的夹角小于90度;
    //这里normal是从三角指向眼的,因此若同方向则不可能穿过三角
    if (dotProduct(ray.direction, normal) > 0)
        return inter; // happen = false;
    /*
    Intersection的定义
        Intersection(){
        happened=false;
        coords=Vector3f();
        normal=Vector3f();
        distance= std::numeric_limits<double>::max();
        obj =nullptr;
        m=nullptr;
    }
    */
    double u, v, t_tmp = 0;
    Vector3f pvec = crossProduct(ray.direction, e2); //S1
    double det = dotProduct(e1, pvec);               //S1*E1(顺便说一句,能推出S1*E1=-D*N)
    if (fabs(det) < EPSILON) //const float EPSILON = 0.00001; 分母特别小将导致t特别大,相当于很远很远,看不见
        return inter;
    double det_inv = 1. / det;                      // 1/S1*E1
    Vector3f tvec = ray.origin - v0;                //S
    u = dotProduct(tvec, pvec) * det_inv;           //b1
    if (u < 0 || u > 1)  
        return inter;
    Vector3f qvec = crossProduct(tvec, e1);         //S2
    v = dotProduct(ray.direction, qvec) * det_inv;  //b2
    if (v < 0 || u + v > 1) 
        return inter;
    t_tmp = dotProduct
  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值