谈谈现有的PBR rendering system

扫花
• 阅读 8858

这篇文章是应麦哥要求写的,在Arnold大行其道,各种渲染器积极修改算法增加path tracing的今天. 想写一篇文章简单讲解一下这些基于物理的渲染系统的工作流程是什么和背后的原理,先抓了一张PBRT书上的插图来说明:

谈谈现有的PBR rendering system

再上一张图解释下光线追踪一类算法的基本原理:

谈谈现有的PBR rendering system

渲染流程

  • 发射光线: 就是sampler根据camera的信息发射光线———也就是对屏幕上像素点的采样,我们可以叫这些光线为eye ray.
  • 空间划分,求交: 之后渲染器的任务是追踪这些光线并和物体求交,这之中会运用到空间划分的加速结构来加速求交, 比如最简单的八叉树之类.
  • 积分,shading: 而求交得到surface信息会传给intergrater进行积分计算和shading,intergrater就是真正执行你的光传播算法的地方,比如path tracing; Photon Mapping; Bidirectional Path tracing 等.
  • 追踪次级光线,计算间接照明: 当然,这些所有的算法都要求渲染系统还会去追踪次级的光线,也就是surface, 反射, 折射等产生的次级光线,并迭代进行积分和shading.积分和shading的结果就是每个像素的radiance.

为什么要叫intergrater呢, 因为Path tracing 和这一类的算法,是利用蒙特卡洛积分去积分渲染方程,得到正确结果---本质上是利用随机方法解高维积分--这个积分是光照、可见性、散射和余弦项的乘积--的过程。 这个过程包括了采样和求蒙特卡洛估计量,而intergrater正是在sampler采样(对屏幕,对表面的BSDF等)之后求积分值的。

了解蒙特卡洛方法本质,看这里:

http://www.opengpu.org/forum.php?mod=viewthread&tid=6768&fromuid=10107

再来看看Mitsuba(类PBRT的一个渲染器)中一个intergrater的定义(Path tracer):

谈谈现有的PBR rendering system

计算radiance的函数:

谈谈现有的PBR rendering system

可以看出对BSDF和light分别作了采样,然后计算radiance的值并组合,同时还用迭代的方法求间接照明,这种方法是一种有效的加快积分收敛的采样办法,后面会提到。

以上是PBRT类的渲染器的工作流程,Arnold或者mantra的办法都是类似的,只不过在软件架构上会有所区别。

关于采样

采样是渲染流程中最核心的步骤,大部分提高效率的办法也都是优化采样过程,渲染流程中会进行的采样过程主要有:

  • 屏幕空间的采样,这个采样的优化方法也很多,自适应采样;低差异性采样等。
  • BSDF的采样,就是根据BSDF形状产生散射的出射光方向。
  • 相函数采样,体渲染时产生散射光方向。
  • 对光源的采样

提高采样效率的主要方法就是重要性采样和多重重要性采样,重要性采样的基本思想是,将采样工作集中到被积函数值相对比较高的地方,那么就可以更有效率地计算出精确的估算值。多重重要性采样则提供了一种可以对不同分布中的采样进行加权的方法。上面的Path tracing intergrater, 就是利用了不同的采策略分别对光源和BSDF采样,然后再用多重重要性采样组合两种结果.

关于提高采样效率,看:

http://www.opengpu.org/forum.php?mod=viewthread&tid=7363&fromuid=10107

为什么production renderer大多采用Path tracing类算法

大多数production renderer采用的是学术界30几年前的算法:Path tracing with MIS(多重重要性采样).而不是各种新研究出的算法. 主要有两个原因:

  1. 算法实现的复杂度, 很多算法实现起来很复杂, 对这些production renderer的架构是一个冲击, 大多数production renderer关注的feature是兼顾生产过程中的细节,如果这些算法要兼顾到bump, displacement,纹理贴图这些细节的话,工作量非常巨大.

  2. 算法本身的适应性, 一些实现起来比较复杂的算法往往是针对某些特殊的场景,而在大部分普通场景下效率不一定比普通算法高,这就导致很多人会采用一个制作上的办法去规避复杂场景(比如image based lighting)而避免去改变渲染器架构.

当然目前的趋势是随着科研界研究的成熟,很多新算法会出现在production renderer中,比如renderman 19 就支持Bidirectional path tracing(也是十几年前提出的算法了) 和Vertex connecting and merging.

总结

Arnold在电影环太平洋和地心引力的成功证明了PBR渲染是大势所趋, 因为随着机器算力的提升,以前看上去运算量巨大的光线追踪任务也可以在短时间内完成. 看见过国内的TD抱怨Arnold渲染慢 占内存的,只能说该增加渲染节点了. 跟不上趋势的总要被淘汰, 因为机器花的时间永远比艺术家的时间便宜.

PS: 如果要详细了解Physically based rendering 的原理和数学方法,包括采样策略,path tracing 算法原理,请看这篇英文的thesis:

http://window.stanford.edu/papers/veach_thesis/thesis.pdf

点赞
收藏
评论区
推荐文章
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
巴拉米 巴拉米
4年前
使用 JavaScript 编写更好的条件语句
在任何编程语言中,代码需要根据不同的条件在给定的输入中做不同的决定和执行相应的动作。例如,在一个游戏中,如果玩家生命点为0,游戏结束。在天气应用中,如果在早上被查看,显示一个日出图片,如果是晚上,则显示星星和月亮。在这篇文章中,我们将探索JavaScript中所谓的条件语句如何工作。如果你使用JavaScript工作,你将写很多包含条件调用的代码。条件调用可
灯灯灯灯 灯灯灯灯
3年前
面试百度和美团,竟然问我多线程安全问题,正好撞在我知识点上
解决多线程安全问题无非两个方法synchronized和lock具体原理以及如何获取锁AQS算法本篇文章主要讲了lock的原理就是AQS算法,还有个姊妹篇讲解synchronized的实现原理也是阿里经常问的,一定要看后面的文章,先说结论:非公平锁tryAcquire的流程是:检查state字段,若为0,表示锁未被占用,那么尝试占用,若不为0,检查
亚瑟 亚瑟
4年前
Flutter - Flutter渲染机制—GPU线程
基于Flutter1.5,从源码视角来深入剖析flutter渲染机制,相关源码目录见文末附录一、GPU线程渲染看Flutter的渲染绘制过程的核心过程包括在ui线程和gpu线程,上一篇文章已经详细介绍了UI线程的工作原理,本文则介绍GPU线程的工作原理,这里需要注意的是,gpu线程是指运行着GPUTaskRunner的名叫gpu
红橙Darren 红橙Darren
3年前
RecyclerView更全解析之 - 仿支付宝侧滑删除和拖动排序
1.概述这是春节前的最后一篇分享技术的博客了,接下来的时间需要去完善视频讲解,至于今年都干了哪些事有什么成就吹牛的这里就不多说了,声明一下图片资源我是盗用的别人的。这是最后一期分享RecyclerView了,我们直接看这一期需要分享的效果:    这里写图片描述      视频讲解:相关文章:          
Easter79 Easter79
3年前
TurnipBit开发板DIY呼吸的吃豆人教程实例
  转载请以链接形式注明文章来源(MicroPythonQQ技术交流群:157816561,公众号:MicroPython玩家汇)  0x00前言  吃豆人是耳熟能详的可爱形象,如今我们的TurnipBit也集成了这可爱的图形,我们这就让他来呼吸了~。  0x01效果展示  先一起看下最终的成品演示视频:  http:/
Wesley13 Wesley13
3年前
2020年写的文章整理到了这里,请查收!
写在前面2020年默默地还是写了很多东西的,微信有了标签功能之后,整理起文章来还是比较方便的。从去年到今年准备写几个专辑,围绕于自己做交易系统或是一些通用解决方案的,当然自己平时爱叨叨的毛病也整理了一个专辑,回顾起来还比较有意思。复杂度治理系统变大之后,对应的复杂度就上来了,除了需要解决各种高性能、高可用、高并发的“规模
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
MYSQL 事务的底层原理 | 京东物流技术团队
事务的底层原理在事务的实现机制上,MySQL采用的是WAL:Writeaheadlogging,预写式日志,机制来实现的。在使用WAL的系统中,所有的修改都先被写入到日志中,然后再被应用到系统中。通常包含redo和undo两部分信息。为什么需要使用WAL,
美凌格栋栋酱 美凌格栋栋酱
5个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
扫花
扫花
Lv1
宁愿只是一首诗,厌腻可抛弃,喜爱就再不忘记
文章
4
粉丝
0
获赞
0