rayTrace 采样

RayTrace in the rest of your life

蒙特卡洛积分

其大致内容大家可以自行去搜索,还是比较直观。上面的连接讲了不同的函数使用蒙特卡洛的例子

使用重要性采样

这里的重要性采样是通过pdf的值来决定的。这里有一个混淆点,一个是scatterPDF一个是SamplePDF,scatterPDF我们可以理解为albedo的属性,就是反射率(或者理解为,光线从一个方向过来后,从这个方向射出去的能量剩余值),比如diffuse材质的为1 / pi。而SamplePDF的表示采样这个方向的radiance 的概率。

设置lambertian材质

这里的lambertian材质,scatter的方向概率为C⋅cos(θo)

class lambertian : public material{
public:
lambertian(const color& albedo) :tex(make_shared<solid_color>(albedo)){}
lambertian(shared_ptr<texture> tex) : tex(tex){}
bool scatter(
const Ray& r_in,const hit_record& rec,color& attenuation,Ray& scattered
) const override{
    vec3 direction = rec.normal + random_unit_vector();
    if(direction.near_zero()) direction = rec.normal;

    direction = unit_vector(direction);
    scattered = Ray(rec.p , direction, r_in.time());
    attenuation = tex->value(rec.u,rec.v,rec.p);
    return true;
}
double scattering_pdf(const Ray& r_in, const hit_record& rec, const Ray& scattered) 
const override
{
    auto cosine = dot(rec.normal, unit_vector(scattered.direction()));
    return cosine < 0 ? 0 : cosine / pi;
}
private:
color albedo;
shared_ptr<texture> tex;
};
double scatter_pdf = rec.mat->scattering_pdf(r, rec, scattered);
double sample_pdf = scatter_pdf;
color color_from_scatter = (scatter_pdf * attenuation * ray_color(scattered,depth-1,world)) / sample_pdf;
return color_from_emission + color_from_scatter;

这里使用相同的pdf,或者你也可以使用均匀的pdf

double sample_pdf = 1.0 / (2 * pi);

但是我们的采样的方式并不是在交点处的半球内均匀的采样,而是依据normal来在一个球内采样。于是我们可以更换采样的方式

vec3 direction = random_on_hemisphere(rec.normal);
inline vec3 random_on_hemisphere(const vec3& normal){
    vec3 on_unit_sphere = random_unit_vector();
    if(dot(normal,on_unit_sphere) > 0.0){
        return on_unit_sphere;
    }
    else{
        return -on_unit_sphere;
    }
}

生成随机方向

相对于Z轴的随机方向生成

文章中的意思我理解了一下,就是我们有两个采样的方向,一个是方位角一个是天顶角,不管是哪个的采样,其采样是独立的但是他们的概率都是1.于是我们需要在0到1的范围内进行采样.首先我们来看天顶角。其采样的概率为1 / 2Π。我们计算到指定的r1的概率的CDF得到下面的推算(CDF就是到指定的角度的概率只和也就是一个概率密度的积分)

于是我们可以推出对应的天顶角为

而对于方位角其概率密度的公式为

b(\theta ) = \int_{0}^{2\pi } p(w) = \int_{0}^{2\pi }p(w)sin\theta d\phi = \int_{0}^{2\pi }d\phi f(\theta )sin\theta = 2\pi f(\theta )sin\theta

我们假设球体密度均匀,此时的f(\theta )的概率密度 = p(w) = 1 / 4 Π

最后推算出这个角度,以及对应的笛卡尔坐标,得到我们半球上的随机点

Uniform sampling a Hemisphere

之前是在球体中采样,但是实际上我们的射线需要在半球上进行采样。当半球的密度是均匀的时候,就会得到下面的方位角

Cosine Sampling a Hemisphere

文章中将pdf更改为p(ω)=f(θ)=cos(θ)/π

通过此PDF就可以得到一个采样的方式

inline vec3 random_cosine_direction() {
    auto r1 = random_double();
    auto r2 = random_double();

    auto phi = 2*pi*r1;
    auto x = std::cos(phi) * std::sqrt(r2);
    auto y = std::sin(phi) * std::sqrt(r2);
    auto z = std::sqrt(1-r2);

    return vec3(x, y, z);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/970919.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

日常工作管理软件比较:6款工具的优缺点深度分析

本文介绍了6款广受欢迎的日常工作管理软件&#xff0c;包括&#xff1a;1. Worktile&#xff1b;2. Asana&#xff1b;3. Wrike&#xff1b;4. Teambition&#xff1b;5. Todoist&#xff1b;6. Notion。 在项目管理中&#xff0c;进度规划是确保项目按时完成的重要环节。无论是…

try learning-git-branching

文章目录 mergerebase分离 HEAD相对引用利用父节点branch -f 撤销变更cherry-pick交互式 rebase只取一个提交记录提交的技巧rebase 在上一次提交上amendcherry-pick 在上一次提交上 amend tag多分支 rebase两个parent节点纠缠不清的分支偏离的提交历史锁定的Main推送主分支合并…

「软件设计模式」单例模式(Singleton)

深入解析单例模式&#xff1a;从思想到C实战实现 一、设计模式与单例模式思想 1.1 设计模式的价值 设计模式是软件工程领域的经验结晶&#xff0c;如同建筑领域的经典蓝图。它们提供了经过验证的解决方案模板&#xff0c;能有效解决以下问题&#xff1a; 提高代码复用性提升…

ICRA-2025 | 具身导航如何跨越地形障碍?SARO:通过视觉语言模型实现地形穿越

作者&#xff1a;Shaoting Zhu, Derun Li, Linzhan Mou, Yong Liu, Ningyi Xu, Hang Zhao 单位&#xff1a;清华大学交叉信息研究院&#xff0c;上海交通大学电子信息与电气工程学院&#xff0c;浙江大学计算机科学与技术学院&#xff0c;宾夕法尼亚大学GRASP实验室&#xff0…

驱动开发、移植(最后的说法有误,以后会修正)

一、任务明确&#xff1a;把创龙MX8的驱动 按照我们的要求 然后移植到 我们的板子 1.Linux系统启动卡制作&#xff0c; sd卡 先按照 《用户手册—3-2-Linux系统启动卡制作及系统固化》 把创龙的Linux系统刷进去。 2. 把TLIMX8-EVM的板子过一遍 把刚刚烧好系统的sd卡插入 创…

免费deepseek的API获取教程及将API接入word或WPS中

免费deepseek的API获取教程: 1 https://cloud.siliconflow.cn/中注册时填写邀请码&#xff1a;GAejkK6X即可获取2000 万 Tokens; 2 按照图中步骤进行操作 将API接入word或WPS中 1 打开一个word&#xff0c;文件-选项-自定义功能区-勾选开发工具-左侧的信任中心-信任中心设置…

机器学习:k均值

所有代码和文档均在golitter/Decoding-ML-Top10: 使用 Python 优雅地实现机器学习十大经典算法。 (github.com)&#xff0c;欢迎查看。 在“无监督学习”中&#xff0c;训练样本的标记信息是未知的&#xff0c;目标是通过对无标记训练样本的学习来揭示数据的内在性质及规律&…

文档搜索工具项目-测试报告

目录 1.项目背景 2.测试环境 3.测试计划 3.1功能测试 3.2自动化测试 1.项目背景 主要采用了前后端分离的方式来实现&#xff0c;把整个项目分成前端模块&#xff0c;索引模块&#xff0c;搜索模块&#xff0c;同时将其布置到云服务器中。该搜索引擎只是基于java API的站内…

Field ‘id‘ doesn‘t have a default value

1.程序测试时,运行到向数据库插入数据时,报以下异常 是id没有默认值; 在测试单元内单独向该数据库插入数据,报同样的异常,确定了异常的定位 2.项目时采用mybatisPlus操作数据库,报异常的数据库和另外一个数据库关联,主键ID和另外一个数据库相同,通过读取另外一个数据库的ID获…

hive:分桶表和分区表的区别, 分桶表,抽样查询

分桶表和分区表的区别 分桶表 建表语法 clustered by 聚类依据 示例 创建分桶表 加载数据到分桶表(错误) load data local inpath /home/sjh/ft.txt into table sjh.ft; 报错: 提示设置 >>set hive.strict.checks.bucketingfalse 作用是关闭 Hive 中的一个严格检查…

【NLP251】命名实体实战(基于Transformer分类)

1. 查看数据集 json解析工具&#xff1a;JSON 在线解析 | 菜鸟工具 快速了解json文件内容分布 2.构建项目框架 project_root/ │ ├── src/ │ ├── medical_ner/ │ │ ├── datas/ │ │ │ ├── __init__.py │ │ │ ├── bmeso_ner_label…

欧洲分组加密算法之Kasumi

目录 (1)FL函数 (2)FO函数 (3)FI函数 密钥扩展算法 欧洲分组加密算法之Kasumi Kasumi分组密码算法是由欧洲标准机构ETSI(European Telecommunications Standards Institute)下属的安全算法组于1999年设计的,被用于构造A5/3、GEA3、f8和f9算法,参与移动通信系统无线…

SpringBoot速成(12)文章分类P15-P19

1.新增文章分类 1.Postman登录不上&#xff0c;可以从头registe->login一个新的成员:注意&#xff0c;跳转多个url时&#xff0c;post/get/patch记得修改成controller类中对应方法上写的 2.postman运行成功&#xff1a; 但表中不更新&#xff1a;细节有问题&#xff1a; c是…

登录弹窗效果

1&#xff0c;要求 点击登录按钮&#xff0c;弹出登录窗口 提示1&#xff1a;登录窗口 display:none 隐藏状态&#xff1b; 提示2&#xff1a;登录按钮点击后&#xff0c;触发事件&#xff0c;修改 display:block 显示状态 提示3&#xff1a;登录窗口中点击关闭按钮&#xff0…

1-16 tortoiseGit分支与Git操作

1-1 创建分支 什么时候需要开分支&#xff1f; - 隔离线上版本和开发版本 - 大功能开发&#xff0c;不想影响到其他人&#xff0c;自己独立开个分支去开发 SVN经典目录结构&#xff1a; - trunk-------------------------开发中的文件 - bran…

【工业安全】-CVE-2022-35561- Tenda W6路由器 栈溢出漏洞

文章目录 1.漏洞描述 2.环境搭建 3.漏洞复现 4.漏洞分析 4.1&#xff1a;代码分析 4.2&#xff1a;流量分析 5.poc代码&#xff1a; 1.漏洞描述 漏洞编号&#xff1a;CVE-2022-35561 漏洞名称&#xff1a;Tenda W6 栈溢出漏洞 威胁等级&#xff1a;高危 漏洞详情&#xff1…

HDFS体系结构

HDFS 支持主从结 构 &#xff0c; 主节 点 称为 NameNode &#xff0c;从节点称为 DataNode HDFS中还包含一个 SecondaryNameNode 进程&#xff0c;只要辅助主节点 公司BOSS&#xff1a;NameNode &#xff08;NN&#xff09; 秘书&#xff1a;SecondaryNameNode (2NN) 员工&a…

物联网智能语音控制灯光系统设计与实现

背景 随着物联网技术的蓬勃发展&#xff0c;智能家居逐渐成为现代生活的一部分。在众多智能家居应用中&#xff0c;智能灯光控制系统尤为重要。通过语音控制和自动调节灯光&#xff0c;用户可以更便捷地操作家中的照明设备&#xff0c;提高生活的舒适度与便利性。本文将介绍一…

大模型开发实战篇5:多模态--文生图模型API

大模型文生图是一种基于人工智能大模型的技术&#xff0c;能够将自然语言文本描述转化为对应的图像。目前非常火的AI大模型赛道&#xff0c;有很多公司在此赛道竞争。详情可看这篇文章。 今天我们来看下如何调用WebAPI来实现文生图功能。我们一般都会将OpenAI的接口&#xff0…

(arxiv2411) CARE Transformer

作者提出了两个问题&#xff0c;问题 1&#xff1a;堆叠是充分利用局部归纳偏差和长距离信息优势的最佳方法吗&#xff1f; 问题 2&#xff1a;是否有可能同时提高线性视觉 Transformer 的效率和准确性&#xff1f; 为了解决这两个问题&#xff0c;作者提出了一种 deCoupled du…