光线追踪-2:光线照射到物体表面后,反射的Radiance怎么求

发布时间:2026/9/12 19:15:59

光线追踪-2:光线照射到物体表面后,反射的Radiance怎么求 0、前言上一节我们知道了如何求光源或自发光的这一节我们来求渲染方程的后半部分。反射分为漫反射和镜面反射入射光又分直接光照和间接光照。图一直接光照光线从光源照射到物体A表面某个点然后反射到人眼间接光照光线从物体B反射出去入射到物体A表面某个点然后反射到人眼那么渲染方程可以扩展为直接光照部分间接光照部分各部分含义​光线照射到物体然后反射出去的 Radiance这个可能会直接反射到眼睛也可能反射到别的物体上成为另一个物体表面某个点的间接光照​从某个方向射来的 Radiance,包含直接光照和间接光照 直接从光源的入射光从别的物体反射出的入射光例图一 物体B接收到直接光照和间接光照然后反射出的光线入射到物体A​材质如何反射光也就是 BRDF包含漫反射和镜面反射cos⁡θ斜着来的光贡献较少入射光与相交表面的法线夹角积分把上方所有入射方向都考虑进去Tips: 本节内容只考虑单一光源多光源需要一个求和计算1、反射 BRDF反射包含漫反射和镜面反射同样也要区分渲染方程可以扩展为1.1 漫反射漫反射可以理解为光照到粗糙墙面后向各个方向比较均匀地散开漫反射反照率diffuse albedo常用 ρ 表示表示材质对入射光进行漫反射的比例,即ρ 漫反射能量 / 入射能量 是一个通常位于 0 到 1之间的参数。在PBR工作流中1对于非金属材质ρBaseColor例如ρ(0.8,0.2,0.1)表示红、绿、蓝三个颜色通道的漫反射反射比例不同。但这只是近似关系尤其在存在纹理、次表面散射、光谱效应等情况下不能简单认为 它就是实验上测得的真实反射率。(2) 对于金属材质ρ0理想情况下金属几乎没有传统意义上的漫反射金属的颜色主要体现在镜面反射的 Fresnel 反射率中而不是 ρ这个 Lambert 漫反射参数中漫反射BRDF即表示入射能量 一部分转化成立漫反射能量 除表示向这个半球均匀发散1.2 镜面反射镜面反射可以理解成像镜子、抛光金属或光滑塑料那样光主要沿一个特定方向反射。物理渲染通常不用简单的 Phong或Blinn-Phong模型而使用微表面模型例如 Cook-Torrance BRDF2、求直接光照的Radiance直接光照光线从光源 -- 物体表面x点 -- 人眼2.1 光源为无半径点光源、方向光因为这两种光源因没有发光面积无法求出Radiance,且只有一个方向 可以用Irradiance 来间接求出发射2.2 光源为面光源面光源是可以理解为很多个点光源组合在一起且可以求出光源Radiance的得到,具体见上一篇(默认真空环境radiance 不会衰减实际环境中也会因为空气颗粒、雾气等衰减)Tips 这个是对面光源上所有的微元y到物体表面x这个方向的立体角进行积分。 因与光线在物体表面的入射角相关所以不能把提到积分外。2.2.1 光线到物体表面x方向的立体角积分 转换为 光源面积的积分对立体角进行积分比较复杂 所有我们通常会把上边的公式转化为 对光源表面微元的面积积分x : 光线招式到的物体表面位置y面光源微元的位置rx到y 的距离光线入射方向与物体表面法线的夹角光线从光源射出方向 与光源微元法线 的夹角光源微元的面积解释一下这个转换可以求出光源微元的辐射强度进而求出入射光线在物体表面的辐照度Irradiance物体表面反射的Radiance2.2.2Monte Carlo 积分 多次采样积分对于计算机来说还是复杂运算可以通过蒙特卡洛 用随机采样来估算积分结果Monte Carlo 积分的步骤1、随机采样N个点,2、每次采样计算的结果除以概率分布函数pdf得到一个预估值3、求和N次的预估值除以N 得到一个例如原积分方程Monte Carlo估计为因为面光源表面微元贡献值一样采样均匀采样对于单个面光源微元的采样概率这个时候就得到直接光照********* 为啥均匀采样得概率分布函数为 **********首先均匀采样得概率分布函数是一个常数总的概率为1则3、求间接光照得Radiance间接光照光线从光源 --物体 -- ... --物体B -- 物体A表面x点 -- 人眼间接光照是一个递归运算公式A表面x点的直接光照 A表面x点的间接光照为物体A表面x点接收到,来自物体B的间接光照 物体B反射出的通过入射物体B某一点的直接光照间接光照 求出的反射计算光线追踪的间接光照时单次反射的采样数还有递归深度都可能造成路径数爆炸。为了避免路径数爆炸实际的优化方向有以下几种3.1 Monte Carla 积分单次采样如果是多次采样每次反射生成的路径会指数级翻倍所以我们采样单次采样。从物体A表面的x点随机选择一个入射方向而不是选择多个方向取 -然后发射一条射线看是否与别的物体有交点。因为只随机选择一个入射方向但需要通过积分所有的入射方向才能算出正确的, 所有需要一个入射方向的概率分布函数, 通过估算出方向的间接光照。 我们需要找到一个合适的常见的几种采样方式及对应的概率分布函数3.1.1 均匀半球采样比较好理解半球内任意方向的概率都是相当的pdf :归一化验证 半球的各方向的总概率为1正确求间接光照优点实现简单适用于所有材质缺点方差极大实际小的方向贡献极小但均匀半球采样的pdf 给了同等的概率不推荐使用3.1.2 余弦加权采样也比较好理解就是余弦函数 再除以一个常数使pdf 的积分等于1特点是pdf 的形状和余弦函数差不多方向小的方向贡献小方向大的方向贡献大pdf :归一化验证 半球的各方向的总概率为1正确求间接光照优点比均匀采样方差小很多适用于漫反射材质公式简洁缺点对镜面反射效果差没有考虑 镜面反射 BRDF 的形状3.1.3 BRDF 重要性采样可以这么理解镜面反射中一束入射光经过镜面反射反射光会在一个反射方向范围内同样也可以认为一个反射方向范围内的所有入射光经过镜面反射变成一束出射光GGX 微表面 BRDF 的采样是微表面法线 h的分布函数: 粗糙度参数 通常: 微表面法线微表面法线 h的pdf入射间接光的 pdf将微表面法线h 的pdf,转换成入射间接光的 pdf 这个变换暂时没搞懂以后再推导pdf :通常的步骤1、随机一个微表面法线h,2、根据, 计算出3、再求或者1、随机生成一个2、求微表面法线3、再求求间接光照( 约掉了、4 、优点镜面反射方差极小求间接光照时光滑材质效果好物理正确缺点粗糙表面效果不如余弦加权实现复杂推导p(w_i)时没有考虑的真实分布3.1.4 该怎么选采样算法均匀半球采样方差太大 余弦加权采样适合间接光照的漫反射BRDF重要性采样适合间接光照的镜面反射。那真实场景中是怎么用的呢1麻布等只有漫反射的材质用余弦加权采样2玻璃等只有镜面反射的材质用BRDF重要性采样3同时拥有漫反射和镜面反射的材质有两种方案3.1.4.1方案1随机混合步骤1、根据材质的性质判断漫反射和镜面反射的比例例如漫反射0.2 镜面反射0.82、从漫反射和镜面反射概率分布函数中随机选一个生成入射光线3、根据生成漫反射pdf、镜面反射pdf4、生成混合pdf 漫反射pdf * 0.2 镜面反射* 0.85、如何判断漫反射和镜面反射的比例这个以后有时间再补上3.1.4.2方案2多重重要性采样 MIS这个就是计算间接光照时发两条射线去计算一个用余弦加权采样一个用BRDF重要性采样然后再合起来具体细节以后有时间再聊总结效果上肯定多重重要性采样 更好但增加了光线路径效率上变慢。实时光线追踪普遍使用的是3.2 递归什么时候停止实际渲染中不能无限递归会栈溢出不能计算无限长的路径太慢必须在某个地方停止递归。3.2.1 方案一、设置最大递归深度这种方式比较简单但有两个问题1损失能量以Cornell Box为例光线在封闭盒子里反复反弹假设每次反弹损失20%能量bounce 0: 1.0bounce 1: 0.8bounce 2: 0.64bounce 3: 0.512bounce 4: 0.410bounce 5: 0.328bounce 6: 0.262...真实总能量 1 / 1 - 0.8 5.0如果递归深度设为3 只计算前4项1 0.8 0.64 0.512 2.952损失了 (5.0 - 2.952) / 5.0 41% 的能量2计算浪费对于高反射率的材质如白色墙后续 bounces 贡献大需要很深的路径。但对于低反射率的材质如黑色布料2~3 次 bounce 后能量就衰减到几乎为 0。固定深度的问题对暗材质浪费计算追踪了没用的路径对亮材质深度不够丢失了重要能量3.2.2 方案二、俄罗斯轮盘赌 推荐通过一个概率值q来决定是否要继续递归 ( 0 q 1), 如果一个0到1内的随机数小于q, 就继续否则就结束递归俄罗斯轮盘赌提供了一种递归终止的方式但因为有1- q的概率会终止所以当递归要继续时返回的,用来弥补能量损失。def trace_ray(ray, depth): hit scene.intersect(ray) if not hit: return background_color L_direct compute_direct_light(...) # # 俄罗斯轮盘赌 # if depth MIN_DEPTH: # 例如 MIN_DEPTH 3 # 计算继续概率 q_continue 0.8 # 或者根据 albedo 动态计算 if random() q_continue: # 停止递归 # 只返回L_direct , 因为L_indirect 0 return L_direct else: q_continue 1.0 # 前几次 bounce 强制继续 # # 继续追踪如果没被杀死 # ω_sample, pdf sample_direction(...) ray_indirect Ray(hit.position, ω_sample) L_o_next trace_ray(ray_indirect, depth 1) L_indirect (f_r × L_o_next × cos) / pdf # # 俄罗斯轮盘赌修正 # L_indirect / q_continue # ← 补偿被杀死的路径 return L_direct L_indirect这个q 值怎么选可以是一个固定值也可以根据材质albedodef get_continue_probability(material, albedo, depth): # 前几次 bounce 强制继续 if depth 3: return 1.0 # 根据路径贡献 luminance 0.2126 × albedo.r 0.7152 × albedo.g 0.0722 × albedo.b q min(luminance, 0.95) # 至少有 5% 继续概率避免完全停止 return max(q, 0.05)3.2.3 总结tips : 因为间接光照的反射时仅采样一个随机方向俄罗斯轮盘赌也会有误差可以通过增加像素的射线数来使结果趋向期望值
延伸阅读

更多相关文章

2026/9/12 19:10:59

Linux文本处理四件套:cut、sed、awk、sort实战指南

接手 Linux 服务器时间长了,你会发现一个特别有意思的现象:很多看起来复杂得要命的问题,最后查来查去,都落到几个最基础的命令上。尤其是处理日志、清洗数据、批量改配置这种活儿, cut 、 sed 、 awk 、 sort …

2026/9/12 19:10:59

双馈风力发电机Simulink建模与电网交互关键技术

1. 项目概述:双馈风力发电机建模与电网交互研究双馈感应发电机(DFIG)作为现代风力发电的主流机型,凭借其变速恒频运行和部分功率变流的技术优势,占据了全球风电市场60%以上的份额。这个Simulink建模项目将完整再现双馈…

2026/9/12 19:10:59

MySQL启动报错找不到MSVCR120.dll?详解VC++运行库缺失的修复方法

这问题我遇到过不止一次,第一次是在帮朋友的新电脑部署 MySQL 5.7,服务启动的瞬间直接弹窗“找不到 MSVCR120.dll”,MySQL 服务状态栏里明晃晃写着“已停止”,当场人有点懵。后来自己调测环境、给服务器装库,前前后后也…

2026/9/12 20:16:01

基于Django的智能控糖食物推荐系统设计与实现

1. 项目背景与核心价值糖尿病已经成为全球性的健康挑战,根据国际糖尿病联盟最新数据,我国糖尿病患者人数已突破1.4亿。在这样的背景下,控糖饮食管理成为刚需,但普通用户往往面临三大痛点:食物GI值难以获取、个性化推荐…

2026/9/12 20:16:01

Java构建物联网平台的优势与架构解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/12 20:16:01

Unity 教程跟完后怎么练:一次只改一个可验收目标

摘要:跟完一个 Unity 案例后,想加背包、换操作、改关卡,却越改越乱?先选一个能看见结果的小改动,写清不改什么,再用正常情况、重复触发和原功能检查判断是否完成。本文给出目标筛选表与假想拾取练习&#x…

2026/9/12 20:16:01

国产AI短剧平台选型三原则:分镜可控、审核可配、分发同步

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/12 20:16:01

Python开发十大常见错误与解决方案详解

1. Python十大常见错误及其解决方法概述作为一门简洁优雅的编程语言,Python凭借其易读性和丰富的生态系统吸引了大量开发者。但在实际开发中,无论是初学者还是资深工程师,都难免会遇到各种"坑"。这些错误轻则导致程序异常&#xff…

2026/9/12 20:11:01

MySQL-存储过程与函数

1.存储过程概述1.1理解含义:存储过程的英文是Stored Procedure.他的思想很简单,就是一组经过预先编译的SQL语句的封装.执行过程:存储过程预先存储在MySQL服务器上,需要执行的时候,客户端只需要向服务器端发出调用存储过程的命令,服务器端就可以把预先存储好的这一系列SQL语句全…

2026/9/12 2:05:33

超人会飞不算本事:系统稳定依赖清晰规则与边界设计

开头先不绕弯子。“#斯坦李吐槽dc 所以超人是无缘无故会飞的嘛哈哈哈哈哈哈哈锤哥真是技术人才啊!#雷神 #复联”这类调侃式短标题,第一波冲击力在于它把两个宇宙的角色塞进同一个吐槽箱里,但细想一下就能发现,它真正碰到的根本不是…

2026/9/12 3:55:12

超人VS蜘蛛侠:拆解超级IP的影响力与传播方法论

把“蜘蛛侠 vs 超人”放在 CSDN 上聊,可能很多人第一反应是走错片场了。但如果把这两个角色看成“两个持续运营了 80 多年的文化产品”,你会发现,这场比较本质上是两个不同 IP 策略的长期结果对比:超人赢在定义了整个超级英雄题材…

2026/9/12 10:09:03

基于CNN的调制信号识别:MATLAB实现时频图分类实战

简介:本资源是一套面向通信工程与信号处理方向学习者、研究者的深度学习实践方案,聚焦调制信号自动检测与识别这一典型无线通信任务,解决传统方法依赖人工特征、低信噪比下性能下降等痛点。压缩包共12个文件(10.73MB)&…

2026/9/12 0:04:17

MATLAB仿生优化框架:长鼻浣熊算法多策略融合实现

简介:本资源是一份面向智能优化算法研究者与MATLAB初学者的仿生智能算法实践代码包,聚焦于长鼻浣熊优化算法(COA)的多策略改进与性能验证。针对传统COA易陷局部最优、收敛精度不足等问题,作者融合Circle映射初始化提升…

2026/9/12 0:04:17

【JAVA毕设源码分享】基于 JavaWeb 的校园一卡通管理系统的设计与实现 基于 JavaWeb 的校园卡业务管理系统(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/9/12 0:04:17

【JAVA毕设源码分享】基于 Java 的图书馆借阅管理平台的搭建与实现 基于 Java 的图书馆综合管理系统(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/9/12 6:29:36

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/12 14:32:17

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/12 6:37:43

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码