【Games101 作业6 + 附加题】渲染兔子 BVH SAH 代码

2023-11-01

基础题部分

根据教程PDF,首先需要引用如下函数(在作业5的基础上稍作修改):

renderer() in Renderer.cpp

解说见注释:

// The main render function. This where we iterate over all pixels in the image,
// generate primary rays and cast these rays into the scene. The content of the
// framebuffer is saved to a file.
void Renderer::Render(const Scene& scene)
{
    std::vector<Vector3f> framebuffer(scene.width * scene.height);

    float scale = tan(deg2rad(scene.fov * 0.5));
    float imageAspectRatio = scene.width / (float)scene.height;
    Vector3f eye_pos(-1, 5, 10);
    int m = 0;
    for (uint32_t j = 0; j < scene.height; ++j) {
        for (uint32_t i = 0; i < scene.width; ++i) {
            // generate primary ray direction
            // TODO: Find the x and y positions of the current pixel to get the
            // direction
            //  vector that passes through it.
            // Also, don't forget to multiply both of them with the variable
            // *scale*, and x (horizontal) variable with the *imageAspectRatio*
            float x = (2 * (i + 0.5) / (float)scene.width - 1) * imageAspectRatio * scale;
            float y = (1 - 2 * (j + 0.5) / (float)scene.height) * scale;
            
            // 从这里开始
            Vector3f dir = normalize(Vector3f(x, y, -1)); // Don't forget to normalize this direction!

            // 在本次代码框架中,castRay()函数放在了Scene类中
            // 并且castRay()的传入参数修改为(const Ray &ray, int depth)
            // 所以要先声明Ray ray(const Vector3f& ori, const Vector3f& dir)
            Ray ray(eye_pos, dir);
            
            // 调用scene.castRay()
            // 并将返回结果(Vector3f类型的像素RGB颜色)存入framebuffer中
            framebuffer[m++] = scene.castRay(ray, 0);
        }
        UpdateProgress(j / (float)scene.height);
    }
    UpdateProgress(1.f);

    // save framebuffer to file
    FILE* fp = fopen("binary.ppm", "wb");
    (void)fprintf(fp, "P6\n%d %d\n255\n", scene.width, scene.height);
    for (auto i = 0; i < scene.height * scene.width; ++i) {
        static unsigned char color[3];
        color[0] = (unsigned char)(255 * clamp(0, 1, framebuffer[i].x));
        color[1] = (unsigned char)(255 * clamp(0, 1, framebuffer[i].y));
        color[2] = (unsigned char)(255 * clamp(0, 1, framebuffer[i].z));
        fwrite(color, 1, 3, fp);
    }
    fclose(fp);    
}

Triangle::getIntersection in Triangle.hpp

解说见注释:

// TODO find ray triangle intersection
inline Intersection Triangle::getIntersection(Ray ray)
{
    Intersection inter;

    if (dotProduct(ray.direction, normal) > 0)
        return inter;
    
    // u,v为三角形重心坐标,即PPT中的b1,b2
    // t_tmp是PPT中的t
    double u, v, t_tmp = 0;
    Vector3f pvec = crossProduct(ray.direction, e2);
    double det = dotProduct(e1, pvec);
    if (fabs(det) < EPSILON)
        return inter;

    double det_inv = 1. / det;
    Vector3f tvec = ray.origin - v0;
    u = dotProduct(tvec, pvec) * det_inv;
    if (u < 0 || u > 1)
        return inter;
    Vector3f qvec = crossProduct(tvec, e1);
    v = dotProduct(ray.direction, qvec) * det_inv;
   
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Games101 作业6 + 附加题】渲染兔子 BVH SAH 代码 的相关文章

随机推荐

  • 分享一个查看css版本兼容性的网站: https://caniuse.com/

    最近在处理浏览器对img标签的图片是否会根据exif信息自动旋转的问题 发现了这个站点 https caniuse com 比如 image orientation https caniuse com search image orient
  • 重新安装系统Windows defender显示页面不可用解决方法

    重装系统后打开Windows安全中心出现 页面不可用 你的 IT 管理员已限制对此应用的某些区域的访问 并且你尝试访问的项目不可 用 有关详细信息 请与 IT 支持人员联系 个人电脑 第一种方法 无论是否安装三方杀毒软件 请您打开 控制面板
  • 计算机网络性能衡量

    1 速率 单位时间 s 内传输信息 bit 量 单位 KB s MB s Gb s K 10 3 M 10 6 G 10 9 一般表示的是理想的传输速率 2 带宽 计算机网络中的带宽和通信等领域的带宽概念不一样 计算机网络中的带宽是指数字信
  • python编写一个函数判断一个数是否为偶数_c语言中判断奇数偶数的函数_创建一个函数来检查Python中的偶数或奇数...

    c语言中判断奇数偶数的函数 In the below program we are creating a function named CheckEvenOdd it accepts a number and returns EVEN if
  • 【经典】数加 ·营销引擎之DSP详解------DSP 、SSP、RTB

    数加 营销引擎 帮助企业快速搭建或升级自有DSP ADN DMP系统 提供高质量的竞价 投放 受众定向 pCTR点击率预估 pCVR转化率预估 相关性评估等核心能力 准备工作 基础认知 DSP 信息流虽然诞生已久 但大热还是近两年的事情 一
  • 合并两个有序数组(C语言)

    让我们来看一下这道题的描述 题目描述 题目 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2 另有两个整数 m 和 n 分别表示 nums1 和 nums2 中的元素数目 请你合并 nums2 到 nums1 中 使合并后
  • torchvision.dataset下载CIFAR10报错解决方法

    使用dataset下载数据集时 出现错误 urllib error URLError urlopen error unknown url type https 考虑没有import ssl 遂补充以下命令 import ssl ssl cr
  • Petya and Exam【Codeforces 1282 C】【贪心】

    Codeforces Round 610 Div 2 C 有N道题目 题目有简单与困难之分 简单的题目花费A分钟 困难的题目花费B分钟 那么考试时间一共有T的情况下 我们是可以提前交卷的 但是有些时间限制 就是譬如说你现在第x分钟交卷 但是
  • 部署项目到服务器

    部署项目到服务器 1 购买服务器 阿里云官网 2 安装宝塔面板 相当于服务器的图形化操作界面 3 开放端口 云服务器端口 宝塔面板端口 4 下载插件 5 部署前后端项目 步骤二 安装宝塔面板 进入到服务器 使用命令安装宝塔 yum inst
  • hive动态分区插入数据

    往hive分区表中插入数据时 如果需要创建的分区很多 比如以表中某个字段进行分区存储 则需要复制粘贴修改很多sql去执行 效率低 因为hive是批处理系统 所以hive提供了一个动态分区功能 其可以基于查询参数的位置去推断分区的名称 从而建
  • 阻塞和非阻塞,同步和异步

    1 例子 故事 老王烧开水 出场人物 老张 水壶两把 普通水壶 简称水壶 会响的水壶 简称响水壶 老王想了想 有好几种等待方式 1 老王用水壶煮水 并且站在那里 不管水开没开 每隔一定时间看看水开了没 同步阻塞 老王想了想 这种方法不够聪明
  • Python与数据分析库Pandas进阶

    引言 Python是一种广泛使用的编程语言 它可以用于各种任务 包括科学计算 数据分析 Web开发和人工智能等 其中 数据分析是Python最强大的领域之一 Python的Pandas库是Python数据分析的中心组件 它为数据科学家和分析
  • 三相同步电机怎么接线图_三相异步电机的正反转原理图解

    来源 网络 异步电动机又称感应电动机 是由气隙旋转磁场与转子绕组感应电流相互作用产生电磁转矩 从而实现机电能量转换为机械能量的一种交流电机 三相异步电机主要用作电动机 拖动各种生产机械 例如 风机 泵 压缩机 机床 轻工及矿山机械 农业生产
  • Error: ER_NOT_SUPPORTED_AUTH_MODE: Client does not support authentication protocol requested by ser

    导语 Error ER NOT SUPPORTED AUTH MODE Client does not support authentication protocol requested by ser 作者 变优秀的小白 Github 关注
  • C++之纯虚函数与抽象类

    C 之纯虚函数与抽象类 什么是纯虚函数 什么是抽象类 什么是纯虚函数 纯虚函数是将基类中的函数声明为虚函数 0的函数 纯虚函数只能声明 不能定义 因为纯虚函数没有函数体 纯虚函数的写法为 virtual 函数返回类型 函数名 参数列表 0
  • 2020-10-08

    项目场景 最近在学习Spring Cloud Stream 组件 记录一下学习中踩到的坑 问题描述 网上很多资料或者视频是使用的依赖是
  • C++:替换string中的字符

    1 按照位置进行替换 string的成员函数replace可以满足这种需求 其变体有很多种 请参考官方文档 以下列举常用的两种 include
  • Jmeter性能测试——1.设置代理

    Jmeter设置代理 1 添加http代理服务器 2 添加线程组 3 设置要录制的服务器IP地址或者域名 4 在线程组中添加 录制控制器 5 设置代理服务器 HTTP Proxy Server 1 gt 配置端口号 默认为8080 2 gt
  • 《The Tao Of Programming》——编程之道

    这本书居然可以结合老子的 南华经 庄子的 庄子 以及 论文 来谈论编程 编程似乎成为了如此文艺的东西 深不可测 后来作者还写了 编程之禅 计算机寓言 信息时代的启示 如此有逼格的东西 下面摘录几句 有点儿意思 The Silent Void
  • 【Games101 作业6 + 附加题】渲染兔子 BVH SAH 代码

    基础题部分 根据教程PDF 首先需要引用如下函数 在作业5的基础上稍作修改 renderer in Renderer cpp 解说见注释 The main render function This where we iterate over