找回密码
 立即注册
查看: 859|回复: 15

理论计算机图形渲染技术是否已经到了没有什么可以研究的地步了?

[复制链接]
发表于 2021-7-15 07:08 | 显示全部楼层 |阅读模式
Offline渲染的各种技术理论已经完备,实时渲染技术除了实时GI之外已经没有研究价值?
发表于 2021-7-15 07:15 | 显示全部楼层
谢邀。我表达一下我的看法。

分水岭从Rendering equation开始。

rendering equation出来之前,渲染都是在瞎搞。因为无目标,无建模。

Jim Kajiya在1986年搞了一个rendering equation,告诉你rendering是什么东西,目标是什么,是什么形式,以后大家都这么就行了。(有一次在电梯遇到这位老前辈,光芒太耀眼,都不敢跟他打招呼。)


其中fr是BRDF,Le是emit,Li是输入光,Lo是输出光,omega_i是入射角,omega_o是出射角,n是normal,lambda是波长,t是时间,x是所在点。

rendering equation出来之后,渲染的框架已定,就剩下一个问题,如何解得更快。除了升级硬件之外,要解得更快,要么用近似,要么另辟蹊径。

在实时计算中,几乎都省略的时间这个参数,并且不考虑全频谱。所以最多就是RGB三个通道计算颜色。第二,那个积分没法搞,所以变成几个简单光源的叠加,或者预积分的cubemap采样。第三,emit就只是简单的加上去,所以后面的讨论都会略去这个。

一下举两个实际例子,让读者可以更容易感受到什么叫解rendering equation。

Light map大家都熟悉。它其实就是在offline把每个点的颜色都算好,运行时直接当纹理贴上就可以了。相当于把rendering equation用查找表的方式来解。由于场景不能变,传统light map之路已经死了。

Precomputed Radiance Transfer是个典型的近似方法。第一步,它把BRDF干掉,变成纯diffuse,再把积分变成根据visibility的叠加。也就是:

第二步,把L_i和V(omega dot n)都表达成SH,就成了

Li项只和环境光有关,V项只和mesh有关。所以两个分别预计算,在运行时sum一下就行了。

这样一处理,就能在realtime对静态场景用上低频的环境光和点光源。还能支持diffuse,扩展到低频的glossy,shadow和一些GI也能。这已经是以前所不可想象的了。所以PRT成为渲染发展过程中的一个里程碑。Peter-Pike Sloan也因此一战成名。

后来PRT被推广到了per-pixel级别、扩展出了可以处理中高频光源、支持更多GI效果、甚至物体可动。。。但由于这样的近似表达能力有限,这条路基本被做死了。

Global Illumination with Radiance Regression Functions 就是个另辟蹊径的方式。既然rendering equation计算量那么大,直接解没希望,那么就当做个隐函数吧。

可是怎么解呢?RRF的方式是通过这几年非常热的机器学习。通过在offline时候提供无数高质量渲染的结果来训练,让神经网络可以在运行时快速估值。这可以做到高速度(上百FPS)和高质量(接近offline渲染质量)的最佳组合。但这方面还有很多需要改进的地方,目前还没彻底展开。

纵观这几年的siggraph,已经很久没有offline rendering的新方法了,因为旧的方法已经涵盖了各个方面,有没有时间压力。realtime rendering新方法也越来越少,发展遇到了一个严重瓶颈。究其原因,是能解决的问题早已被解决,未解决的问题谁都搞不定。其实真正未解决的只有一个圣杯级别的问题,那就是实时全效果GI,也就是如何更好更快地解rendering equation。要在这方面有突破,需要很多时间精力金钱。风险太大,谁都不想碰也不敢碰。所以我说目前没有什么可以研究的。甚至更悲观的是,这个问题有可能永远无法在现有体系内解决。

但愿在未来的几年,有人又突然发现了一条新路,又有人可以冲上去研究个几年。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
发表于 2021-7-15 07:22 | 显示全部楼层
我尝试抱着积极的态度谈一下对这个问题的看法。首先这个问题挺大,不好一概而论的说这个问题是不是已经做到头了。我觉得可以大概分成光传输模拟(Theory of Light Transport Simulation)的理论,离线渲染和实时渲染的算法和应用来谈谈。

首先,对于光线传输的模拟的基础理论,的确可以认为差不多是做到头了。Eric Veach一篇97年的PhD thesis (https://graphics.stanford.edu/papers/veach_thesis/thesis.pdf) 谈到的理论至今还是许多最新论文的基石。例如光线路径的公式(Light Path Formulation),多重重要性采样(Multiple Importance Sampling)还有Markov Chain的应用等。其他渲染所涉及到的基础理论例如光在介质中传播(Participating Media),Photon mapping那些基于Density Estimation那套东西的理论,各种材质的建模(Appearance Modeling),还有最基本的数学工具Sampling & Reconstruction都被搞得很成熟了。现在的渲染早已不是拼基础理论的方向,我认为也很难再出一些能颠覆我们认知的基础理论再被发明或者发现。这些方向的成果也大多都是站在物理学、数学、统计学等的肩膀上完成的。但我认为渲染就是一个不能止步于基础理论的方向。尽管各种理论都已经成熟,但是rendering equation积分的维度太高,中间brdf项还有蛋碎的delta或者near delta distribution,所以效率和健壮性都是很大的挑战,有挑战和不足自然就还有工作可以做。

我用自己的渲染器随便举个例子,那个大玻璃窗上一堆噪点就是因为玻璃的反射分布是一个奇点(delta distribution)。因为从窗外射入窗内的房间,再由窗户反射出来到眼睛的光经过了两次这种delta distribution的洗礼,没有办法被很好的采样,就噪点了。。这是常说的Specular-Diffuse-Specular路径,类似比较难搞的场景还有不少。。(例如点光源的焦散,visibility很差的光源等)



然后对于离线渲染来说,research的确相对于其他方向例如vision,animation来说不太好做。但我倒是觉得最近几年有些paper还是很不错和比较能开我的脑洞的。就不提热门的VCM了。我还很喜欢这一篇2013年的Path Space Regularzation,作者天才的把Photon mapping里面那种merge临近光子的思想用到了采样光线路径方向上。这样做的好处是第一实现起来简单,不像PM、VCM有额外的内存开销,而且可以证明的是引入的Bias也更小(这是个有偏一致的算法)。因为是Analytical的所以实现的成本还是很小。
还有2012年渲染Participating Media的Joint Importance Sampling. 它提出了一个explicit的在Volume里面建立特定长度的光线路径的方法,比传统直接重要性采样phase function或者transmittance来建立光线路径的做法收敛要快不少。而且将这个方法结合到Path Tracing里去是有Analytical的方程的。。十几行代码也就搞定了,太开心。

还有去年SIGGRAPH的UPBP. 基本就是Participating media版本的VCM,将不同的volume estimator用多重重要性采样结合起来,能比较robost的渲染不同属性的volume。
再例如去年的 http://lightrig.de/publications/p2014/HSLT/HSLT_preprint.pdf ,把robotics里的Generalized Coordinates用来表示光线路径而且得到了更快的收敛结果,当时真的开了我的脑洞。期待这方面后续的research。
其他人提到的用神经网络和其他ML的方法我也觉得暂时在纯YY的实验性阶段。。但是综上我想说的是rendering从efficiency和robustness的角度来看还是有很多东西可以研究的。

最后,对于实时渲染来说,学术圈很少做这方面的研究的东西。像我之前这个答案 - 现阶段应该怎么学习计算机图形学呢? - 文刀秋二的回答 说的,都是各种smart hacks,对真正学术理论的贡献比较小。Physically based shading就那么几个公式在网上还都是现成的,是个游戏引擎都可以用。做这方面工作的大多是游戏公司以及显卡公司,这类东西通常非常的practical和hacky,今天搞出来一个东西明天就马上想能加到游戏引擎里去那种,例如VXGI,HBAO+,TXAA等。而因为所有这些技术都是完全依赖GPU的,显卡公司当然有绝对的研究优势去运用新的硬件feature发明新的算法。再加上现在图形API的成熟,很多效果都高度受制于硬件的性能和feature,从这个角度来说实时渲染就是被显卡公司驱动的也不为过(当然还有Epic这类引擎公司)。总之实时渲染是跟着industry走的,学校要有研究大多也是和NV这种公司有合作,而industry关注的面往往比渲染多很多,甚至有4k,跨平台,VR,新的图形API。

以上全是个人观点,完全不代表我的Employer

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
 楼主| 发表于 2021-7-15 07:31 | 显示全部楼层
我曾经也以为我把图形学的知识点都掌握了,我也觉得这个领域,特别是光照物理模拟上理论已经到头了,再发展都是些小修小补,例如采样的trick提升raytrace性能,各种模拟近似的优化提升实时计算性能,再然后就是物理模拟领域的结合,等等,像PBR这样的理论突破相当困难。
直到...看到这几年神经网络开始在图形学领域大力出奇迹,完全颠覆了我对图形学的认知,例如:
Nvidia通过每个像素一次raytrace采样,然后用神经网络优化降噪,以达到实时raytrace,Introducing the NVIDIA RTX Ray Tracing Platform
Facebook使用深度神经网络将人脸的4D数据 encode成隐式的BRDF纹理/材质和Deformation Graph 来实现photo realistic的人脸渲染和超低带宽数据传输 Facebook animates photo-realistic avatars to mimic VR users’ faces
Nvidia通过神经网络超分辨率采样(DLSS),将低分辨率渲染的G buffer(Normla,depth,RGB)放大到2K甚至4K 实现高性能渲染 DLSS: What Does It Mean for Game Developers? - NVIDIA Developer News Center
Deepmind通过神经网络实现的Neural Render,CNN直接将隐式层输入的信息渲染成3D场景https://deepmind.com/blog/article/neural-scene-representation-and-rendering
Google 搞的开源可微分渲染层,将神经网络大力出奇迹的能力和渲染结合到一起,https://github.com/tensorflow/graphics


这些新的研究成果让我看到,以前图形学那种干净的数学公式可能表达能力会被神经网络超越,干净的结构化数据(Volume,Point Cloud,Mesh)表达能力会被隐式的,经过神经网络降维的非结构化数据超越,这需要全新的数学理论和图形学框架来支持,虽然底层物理意义还是raytrace,brdf那一套,但计算过程会完全不一样。
我是非常一颗赛艇的。


PS,回答转自我另一个问题
发表于 2021-7-15 07:37 | 显示全部楼层
渲染应该说本身就已经是比较成熟的领域了,我认为是在理论上是没什么可研究的了。离线渲染本质是用各种采样方法快速求解渲染方程。而实时渲染基本上是提出各种可以在GPU运行框架内执行的近似算法,所以本质上收到了光栅化渲染框架的限制,你看人家Morgan Mcquire做了那么多实时渲染的work,有些是很clever,但是总体来说其实都很trivial。可编程GPU管线已存在多年,能被利用的特性都已被充分挖掘。

所以现在很多做Rendering的researcher都在搞什么呢,欧洲那帮人还是整天在推数学研究更快的采样方法,还有一小拨人隔几年灌一篇BVH的paper,基本上都是些在特定情况下实现marginal性能提升的文章。美国其实并没有太多活跃的人在做rendering。

在一个成熟的领域做research要怎么做?当然是加assumption。你XX算法很好是吧,嗯,但是现在有这种情况Y,你看也很常见吧,用我的改进之后在这些地方就能快很多,虽然还有更多地方其实变慢了,但是没关系,我们现在就是要看这种情况。你不能否认这是我的contribution所以你不能拒我。至于这东西对工业界到底有没有用,关我屁事,我能发paper就好了。

Siggraph近些年基本没有什么靠谱的rendering文章。当然了,整个图形学领域其实都越来越向扯淡的方向发展。大部分paper完全不值一看。越来越多的work变得跟vision之类的work一样,调调参数硬把一个demo hack出来就可以发论文了,其实那个方法换了任何一个其他场景都不能很好的work。要让他对一个新场景work,要么要加新的条件判断去hack,要么调参数掩盖缺陷。

所以我已经懒得搞纯graphics的东西了,现在在做的事情是为高性能实时渲染提供编译器/系统工具支持。

另外我也不看好在rendering里面扯一些机器学习的东西,能用数学模型描述清楚的东西却用模糊的方法去解决本质上是不太科学的。当然你总是可以说渲染不在于绝对数值正确,而是如何把人糊弄过去。因为我们不知道如何糊弄,所以寄希望于机器学习来神奇地完成这个任务。虽然涉及到感知的事情确实不好处理,但寄希望于机器学习更加让人不安。或许某一天在这方面能有突破,但我不会建议在这方面耗尽青春,因为希望比较渺茫而且你很难在这个过程中学到有意义的东西。
发表于 2021-7-15 07:43 | 显示全部楼层
来搞simulation吧少年。
发表于 2021-7-15 07:50 | 显示全部楼层
不会,很多渲染算法按照目前的算力来看只能离线烘焙,并非真的实时计算,但是随着硬件发展,以前本来只能离线烘焙的计算也能做到实时了。
典型的比如光追,ao,gi等等
其实个人理解最终极的图形学是直接把整个世界用纯粒子方式实时计算和模拟。不幸的是我们的硬件算力远远达不到这个要求,目前依然是“看起来正确就正确”的模式来做的渲染。所以图形学这块不论是算法还是硬件,应该还有相当长一段时间可以继续协同发展,相辅相成。
这个终极还是以现在我能理解的水平来设想的终极,因为世界目前来看是由各种粒子组成的,一旦图形学发展到那个地步,但是物理学又发现世界由更加微观一级的物质组成和驱动的呢?
发表于 2021-7-15 07:54 | 显示全部楼层
gmm大神的回答已经很完善了,我来补充一下offline的东西,其实仔细看这几年SIGGRAPH论文关于light transport的东西,更新很少,或者说创新点不够多。一些号称比较火的算法,比如VCM,在实际应用中依然是残废的。今年有一篇用online learning 学习light transport分布的论文,实际看下来也存在很多问题:学习时间过长,应对问题太少等等。

我觉得GI的真正问题在于没有很好的一种方法 或者 方法组合,来解决大部分场景中的光学问题,比如说progressive photon mapping适合渲染焦散,但在其他场景残废,BDPT对大部分效果都有很好的鲁棒性,但是对SDS路径无解,MLT适合各种复杂光照,但是参数和适应性太小。因为实际上光传输属于最难模拟的一类自然现象,复杂程度太高.未来对于光线追踪来说唯一的办法可能就是多种办法的结合。

所以现在对于图形学迫切需要的是新路子,根本革新。个人看好机器学习和蒙特卡洛方法的结合
发表于 2021-7-15 07:57 | 显示全部楼层
如果要求完全物理真实,速度再提高一千倍也未必够用,所以还有发展空间,与其说绘制理论完善,不如说现有数学工具已经被用尽。

通用性的Light Transport Simulation已经二十年没有实质性进步了,速度提升更多是受益于硬件能力提升,受目前数学工具所限,算法不可能有大的提高。另外,复杂如光传输模拟,总能设计复杂的场景让算法不那么有效。
发表于 2021-7-15 08:06 | 显示全部楼层

(第一不分先讲背景:技术一点的内容在下面)

大学时,有一段时间对渲染非常感兴趣。当时在开发一个类似谷歌地球的东西,有好多好玩的小功能。主要是用3D自由摄像头和时间线来控制探索历史变迁什么的。虽然跟专业的关系不大,但是正好可以结合一些数学+地图+历史+编程的爱好。所以投资了好多时间。
时间久了,很多东西都忘掉了。只记得那些大致的小发现或小方法。(有一段时间在谷歌搞WebGL相关的,街头实拍什么的,但是那个项目不怎么需要动脑子)
前两天,突然发现知乎上有一大堆渲染类话题。一下子,各种回忆都突然想起来了。然后很想写这方面的回答。花了整个周末把之前的代码找出来,结果已经找不到了。(硬盘太多,很多都已经挂了不能再用)。
所以今天给自己休假一天,尽量把一些当时的原理找回来重新实现。
同时,希望对大家有所帮助。
(为何跟话题有关,最后再写个总结针对这个问题,可能更清楚一些)
---
首先,我的渲染逻辑和思路跟大家都不太一样。差距较大。
1)我比较喜欢从设备硬件基础功能(底层输入)出发。因为我喜欢控制里面每一个细节。随我来说GPU的shader language(渲染语)就是万能的。
2)现在的主流行业思维是"bottom-up"。调用各种成熟的高级功能;把3d世界里所有对象都渲染出来,再想办法简化速度化。最后变成一张渲染结果。我比较喜欢“top-down”,这张图上每一个像素最后到底该渲染什么颜色,让每一个像素去探索世界好了。
3)什么三角形组成的polyhedra、polygon之类的,我一点都不感兴趣。虽然也比较熟悉,但是从一开始就有极大发自内心排斥感。一个像素并不需要知道世界上所有三角形在哪儿。
4)时间time(比如动画)也只是多了一个数据维度,并不需要每次重新画。跟换一个3D角度一样,甚至更容易。(虽然这一篇不太涉及得到,以后再写)。
5)不太在乎亮光,影子效果这种玩意。或者说我的重点放在渲染能力及效率,而不在美感方面。
(对颜色什么的也不是特别敏感,或者感觉次要)
有点类似raycasting,但是要考虑到最现实的那些问题。如何去画任意复杂形状的东西?我并不想画什么简单玻璃球形之类的呢?
---
OK, 为了这个演示,准备了一个python小库lib.py:

也就这么一点。不详细解释了。反正就是简单利用一个shader画(Draw)一张图得了。
Python可以简略一些,这方面。每次调用Draw,假设所有像素(屏幕)在 [-1,-1]:[1,1]之间一个正方形空间。
之后的工作,那就是Fragment Shader来负责。重点放在Fragment Shader。每个像素被并行处理。Vertex Shader(+Geometry Shader)那一套暂时不管了,我只想要一个每个像素独立并行计算颜色的空间。
如果读者不熟悉:我比较喜欢的这个 Fragment Shader 所负责的就是:一个像素到底显示什么颜色。唯一的输入就是它在屏幕上的位置。GPU能够将所有像素同时一起算出来,所以这种事情不太适合CPU。当然了,处理一个像素的计算能力相当弱,要慎重。照样可以干很多事情了。
运行脚本是这样的:


尽量用最简单的,这个while loop可以一秒画一百张,也可以画一张直接保存图片再退出。这一些不是很重要。(这里的Draw是以2.5的距离慢慢随机旋绕 [0,0], 重复每秒渲染100次左右)
Uniform(不变量)是什么?是发给所有像素Fragment Shader的共同变量。不变是因为任何像素都看到一样的值。这样做会方便一些。比如摄像头位置(rayOrigin),摄像角度之类的。要不然所有像素到底怎么知道渲染什么?比较重要。随便提供什么Uniform都可以输入给Fragment Shader。
我的Fragment Shader一般怎么写?这里得先解释思路。
-----
比较喜欢“立方体”cube。因为一切计算都更简单。其实整个思路建立在立方体上面。
我们第一个目标是渲染一个立方体:
Simple Fragment Shader:


上面加载所有uniform。
中间是一个函数。从一个像素[-1.1]^2的位置,算出它在3D世界里的一条线rayDirection。
这一段就跟raycasting/raytracing一样。

(camera origin就是我的那个rayOrigin)
我们这个像素的一条线发出来了,碰到什么?这不就解决了吗?
碰到了以后,通过distanceTravelled就可以获得与对象相交的位置。
“gl_FragColor”是Fragment Shader主要固定输出;也就是这个像素的最后颜色。
(这里,为了简化,就直接把对象相相交点的位置转换成颜色。不太擅长这个。计算机颜色是三四个0-1的权重,一个四维向量,然而对象位置也是一个-1到1的向量。比起同一颜色好一些。如果这条线没碰到任何对象,那就涂为黑色:0)
探测一个立方体是这样:


原理很简单:


解释:任意一条线必须跟正方形的四个边相交。(除非parallel,现实中可忽略)
然后相交的次数决定这条线是否进入了正方形。
(把这个概念放到三位、四位、还是一样)
所以有这样的一张图:
(把这些代码加起来)

-----
好了,那下一步;(实际上一直在旋绕,只要截图)
如何显示任意形状?
这里就得介绍一个cubetree(立方体树)的概念:
每一个立方体都可以分为八个小立方体。其中每一个可以再次切小。切小切削到比一个像素还要小,根本看不出来是立方体所组成的。
代码:

我知道有点复杂。可是我用了类似的算法渲染过各种东西。已经差不多最简化了。
意思是这样;一旦发现了一个立方体,再调查该立方体里面的八个部分(树根)。
一条线一直从摄像头往前走,经过大的小的立方体。什么时候遇到空的立方体,就可以直接放弃了走到下一个了。大概这样:



只不过是把这个思维做成三维以上。
走到了某个立方体,对方可以宣布自己是空的,然后直接掠过,往前跳过。也可以宣布自己里面有东西,拆开走更小步。结果真的没碰到东西,那就可以去下一个立方体了。
比如这样:

每一个立方体都报告自己是否与一个对象重叠。(比如一个球表)

(分别是4层,8层,12层)
(13层以上没什么用,因为已经比一个像素还小;毕竟是倍数详细化的)
这样算,也挺快的,比一百万个三角形都快。因为已经是O(logN)。
每个像素都能快速扎到对象边界,有点类似binary search(把这个方法做到一维空间也就是binary search好吗?)只不过是每一个像素独立进行自己的search。
当然不仅限于球形什么的。还可以快速渲染fractal。

(这里是个最简单的sponge fractal;其他fractal都一样快。还不需要Distance Estimation微积分什么的。可以直接让立方体自己测试)
代码:

(唯一的区别就是大小cube是否存在-是否与fractal重叠-的那一段代码)
这还不是特别优化的代码,怎么这么快?这个ray还能选择性测试前面的大小立方体。所以根本不需要1024*1024*1024这么多小立方体。因为树根结构,每一条线(每个像素)只需要测试自己经过的30-120个。当然有用!
(唯一的区别就是cube是否存在的那个函数代码)
用这种方法渲染fractal也很好玩。以后再专门写一篇。

(现实这种复杂一点的fractal也可以,但是要hack一下代码。当然不是这个小程序做的图,但是差不多,只不过颜色没那么精致。颜色反射这方面我没有研究很多。)
-----
这大概是几个基本的概念。一两天也只能做到这里。
当然可以用这种方法来渲染更复杂的model。以前开发的东西就是这样的。
把polygon model转换成立方体树根就比较难了。这里还没来得及重新实现。甚至没介绍4D texture的用途,如何把树根写成texture,等等。反正,转换了之后,一切都很简单。整个scene或animation都可以用最简略(压缩)的同一个树根来描述。
为何比普通渲染流程强?因为无论场景有多复杂(无论多少个对象),时间需求都差不多。近的远的若干个对象的形状,都是O(logN)的效率来渲染。彻底利用了GPU那种并行计算的能力。多余的计算也没多少。
当然还有很多问题存在;可是一切普通fragment shader能干的(什么颜色影子之类的),一样能补充进去。关键是把一个立体空间简化成了一个数根结构,更适合渲染。
到底有多少公司或产品在用这种方式?并不是很多。这种软件做法,减少渲染效率,如果加油开发;能够改变好多。有点类似binary search/sort方法对于快速search的贡献。
软件方面还可以提高那么多,感觉很明显了。
(单独用fragment shader来做渲染,也不是很理想。主要因为目前的硬件支持。因为这种树根需要搜索texture。GPU的设计不太包容这种几百次反复搜索texture和pointer的做法。一般GPU最多一百次调用texture。有些workaround/loophole可利用,以后再讲,可是整体GPU结构不够支持这种算法。我一样感觉这就是未来的渲染路线之一。不管是软件还是硬件,这个算法不可缺少)
(好多细节没来得及解释了,道歉,今天写的这一篇有点急。 看一看代码的comments吧?)

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2025-1-17 03:12 , Processed in 0.102818 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表