《学一辈子光线追踪》 四点五 代码对比分析

2024-04-07 20:38

本文主要是介绍《学一辈子光线追踪》 四点五 代码对比分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

蒙特卡洛光线追踪技术系列 见 蒙特卡洛光线追踪技术

先粘贴一下以前的lambertian代码:

class lambertian :public material {
public:lambertian(texture*a):albedo(a){}virtual bool scatter(const ray& r_in, const hit_record& rec, vec3& attenuation, ray& scattered)const {vec3 target = rec.p + rec.normal + random_in_unit_sphere();scattered = ray(rec.p, target - rec.p);attenuation = albedo->value(rec.u,rec.v,rec.p);return true;}texture* albedo;
};vec3 color(const ray&r, hitable *world, int depth) {hit_record rec;if (world->hit(r, 0.001, MAXFLOAT, rec)) {ray scattered;vec3 attenuation;vec3 emitted = rec.mat_ptr->emitted(rec.u, rec.v, rec.p);if (depth < 50 && rec.mat_ptr->scatter(r, rec, attenuation, scattered)) {return emitted + attenuation*color(scattered, world, depth + 1);//}else {return emitted;}}else {return vec3(0, 0, 0);}
}

再放一下现在的代码:

class lambertian :public material {
public:lambertian(texture*a):albedo(a){}virtual float scattering_pdf(const ray& r_in, const hit_record& rec, const ray& scattered)const {float cosine = dot(rec.normal, unitVector(scattered.direction()));if (cosine < 0)cosine = 0;return cosine / M_PI;}virtual bool scatter(const ray& r_in, const hit_record& rec, vec3& alb, ray& scattered, float &pdf)const {/*vec3 direction;do {direction = random_in_unit_sphere();} while (dot(direction, rec.normal) < 0);scattered = ray(rec.p, unitVector(direction), r_in.time());alb = albedo->value(rec.u, rec.v, rec.p);pdf = 0.5 / M_PI;return true;*/vec3 target = rec.p + rec.normal + random_in_unit_sphere();scattered = ray(rec.p, unitVector(target - rec.p),r_in.time());alb = albedo->value(rec.u, rec.v, rec.p);pdf = dot(rec.normal, unitVector(scattered.direction())) / M_PI;return true;}texture* albedo;
};vec3 color(const ray&r, hitable *world, int depth) {hit_record rec;if (world->hit(r, 0.001, MAXFLOAT, rec)) {ray scattered;vec3 emitted = rec.mat_ptr->emitted(rec.u, rec.v, rec.p);float pdf;vec3 albedo;if (depth < 50 && rec.mat_ptr->scatter(r, rec, albedo, scattered,pdf)) {return emitted + albedo * rec.mat_ptr->scattering_pdf(r,rec,scattered) *color(scattered, world, depth + 1);//}else {return emitted;}}else {return vec3(0, 0, 0);}
}

首先我想解决一个问题,为什么我的图片这么暗?

一开始我认为自己的代码是没有什么问题的,结果跟踪检查,发现原来是

return emitted + albedo* rec.mat_ptr->scattering_pdf(r,rec,scattered)  *color(scattered, world, depth + 1) / pdf;

最后面少了一个除以pdf。

这是我们p(direction) = cos(theta) / Pi的结果:

这是我们p(direction) = 1/(2*Pi)的结果

Color = (A * s(direction) * color(direction)) / p(direction)

对于lambertian 材料来说,散射pdf为 s(direction) = cos(theta) / Pi 。

为什么这两幅图我们分析应该产生的是一样的结果?(虽然最后结果不一样)

因为,我们两个图都是在发射出了不同pdf的光线后,又除以了各自的比重,所以都不会过采样也不会欠采样。

首先,对于朗伯材料来说,它的BRDF我们可以认为是固定的,即给定某根已经产生的scatter Ray,该Ray不管用什么pdf采样技术采样到的,计算scattering_pdf得到的值一定是一样的。

我们采用了某种技术来产生光线,我们假定该技术产生光线及其对应的PDF是正确的,所以当我们计算的帧数足够多了以后,按理来说是应该生成相同的图像才对。但是这里并没有生成相同的图像,有一个比较均匀,一个明暗对比比较明显。

这说明了一个问题:我们的生成随机方向的Ray并不符合我们理想中它的PDF,要么是产生半球方向的随机方向PDF不符,要么是产生朗伯随机方向的PDF不符,要么两者都不符。

 

这篇关于《学一辈子光线追踪》 四点五 代码对比分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/883616

相关文章

uniapp接入微信小程序原生代码配置方案(优化版)

uniapp项目需要把微信小程序原生语法的功能代码嵌套过来,无需把原生代码转换为uniapp,可以配置拷贝的方式集成过来 1、拷贝代码包到src目录 2、vue.config.js中配置原生代码包直接拷贝到编译目录中 3、pages.json中配置分包目录,原生入口组件的路径 4、manifest.json中配置分包,使用原生组件 5、需要把原生代码包里的页面修改成组件的方

公共筛选组件(二次封装antd)支持代码提示

如果项目是基于antd组件库为基础搭建,可使用此公共筛选组件 使用到的库 npm i antdnpm i lodash-esnpm i @types/lodash-es -D /components/CommonSearch index.tsx import React from 'react';import { Button, Card, Form } from 'antd'

17.用300行代码手写初体验Spring V1.0版本

1.1.课程目标 1、了解看源码最有效的方式,先猜测后验证,不要一开始就去调试代码。 2、浓缩就是精华,用 300行最简洁的代码 提炼Spring的基本设计思想。 3、掌握Spring框架的基本脉络。 1.2.内容定位 1、 具有1年以上的SpringMVC使用经验。 2、 希望深入了解Spring源码的人群,对 Spring有一个整体的宏观感受。 3、 全程手写实现SpringM

十五.各设计模式总结与对比

1.各设计模式总结与对比 1.1.课程目标 1、 简要分析GoF 23种设计模式和设计原则,做整体认知。 2、 剖析Spirng的编程思想,启发思维,为之后深入学习Spring做铺垫。 3、 了解各设计模式之间的关联,解决设计模式混淆的问题。 1.2.内容定位 1、 掌握设计模式的"道" ,而不只是"术" 2、 道可道非常道,滴水石穿非一日之功,做好长期修炼的准备。 3、 不要为了

[职场] 公务员的利弊分析 #知识分享#经验分享#其他

公务员的利弊分析     公务员作为一种稳定的职业选择,一直备受人们的关注。然而,就像任何其他职业一样,公务员职位也有其利与弊。本文将对公务员的利弊进行分析,帮助读者更好地了解这一职业的特点。 利: 1. 稳定的职业:公务员职位通常具有较高的稳定性,一旦进入公务员队伍,往往可以享受到稳定的工作环境和薪资待遇。这对于那些追求稳定的人来说,是一个很大的优势。 2. 薪资福利优厚:公务员的薪资和

代码随想录算法训练营:12/60

非科班学习算法day12 | LeetCode150:逆波兰表达式 ,Leetcode239: 滑动窗口最大值  目录 介绍 一、基础概念补充: 1.c++字符串转为数字 1. std::stoi, std::stol, std::stoll, std::stoul, std::stoull(最常用) 2. std::stringstream 3. std::atoi, std

记录AS混淆代码模板

开启混淆得先在build.gradle文件中把 minifyEnabled false改成true,以及shrinkResources true//去除无用的resource文件 这些是写在proguard-rules.pro文件内的 指定代码的压缩级别 -optimizationpasses 5 包明不混合大小写 -dontusemixedcaseclassnames 不去忽略非公共

人工和AI大语言模型成本对比 ai语音模型

这里既有AI,又有生活大道理,无数渺小的思考填满了一生。 上一专题搭建了一套GMM-HMM系统,来识别连续0123456789的英文语音。 但若不是仅针对数字,而是所有普通词汇,可能达到十几万个词,解码过程将非常复杂,识别结果组合太多,识别结果不会理想。因此只有声学模型是完全不够的,需要引入语言模型来约束识别结果。让“今天天气很好”的概率高于“今天天汽很好”的概率,得到声学模型概率高,又符合表达

麻了!一觉醒来,代码全挂了。。

作为⼀名程序员,相信大家平时都有代码托管的需求。 相信有不少同学或者团队都习惯把自己的代码托管到GitHub平台上。 但是GitHub大家知道,经常在访问速度这方面并不是很快,有时候因为网络问题甚至根本连网站都打不开了,所以导致使用体验并不友好。 经常一觉醒来,居然发现我竟然看不到我自己上传的代码了。。 那在国内,除了GitHub,另外还有一个比较常用的Gitee平台也可以用于

高度内卷下,企业如何通过VOC(客户之声)做好竞争分析?

VOC,即客户之声,是一种通过收集和分析客户反馈、需求和期望,来洞察市场趋势和竞争对手动态的方法。在高度内卷的市场环境下,VOC不仅能够帮助企业了解客户的真实需求,还能为企业提供宝贵的竞争情报,助力企业在竞争中占据有利地位。 那么,企业该如何通过VOC(客户之声)做好竞争分析呢?深圳天行健企业管理咨询公司解析如下: 首先,要建立完善的VOC收集机制。这包括通过线上渠道(如社交媒体、官网留言