大家好
超久不见
这次跟大家聊一下
瞬间能渲完效果图这事
过去
像下面那样高精度的一张图
假如分辨率是2560*1924
以小时为单位是不过分的
下图截自VRay官方画廊
现在
几秒钟就能完成一张高品质渲染图
和我刚接触VRay半小时渲一个茶壶那会儿
显然已经不是一个时代
画面越来越好的Lumion
NVIDIA的RTX实时光线跟踪等等
都让渲染时间大幅缩短
甚至诞生了新的交互方式
下图截自
虽然我现在的工作内容
已经与渲染的关系不大
但依旧非常热爱渲染
在工作之余
加上某些机缘巧合
受到一些文章的启发
磕碰地写了几百行蹩脚代码
经过几番尝试
终于在Unity3D里
实现了简单的实时光线跟踪
模拟了天空光和太阳光一次反弹
并没有用RTX,因为女朋友不让买RTX显卡
我们先看效果
再看实现思路
1080p每秒达到了60帧以上
平均每张图只需0.016秒
确实有点瞬间完事的意思
动图不流畅和有噪点是gif压缩带来的,静帧就好多了
如果是Unity的默认效果
光照效果扁平,不真实
文章封面也是用了这个方法渲染
每帧每像素256条射线(256spp)
画面几乎没什么噪点
无需任何预计算
模型能任意移动,缩放,新建和删除
灯光能随意修改
如果能在SketchUp里呈现这效果
想想还是超爽的
为了检验蹩脚代码的可靠性
用VRay渲染同样的场景作为参考
场景里摆放一个太阳光和一个天空光
GI反弹次数设置成一次
两者结果还是非常接近的
忽略两张图后处理不同而带来的差别
如果放在UE4里
在动态不烘焙的情况下
效果也没法看
基于UE4做的可视化软件
如果宣称能出高品质效果图秒天秒地带来革命
除非有自己专门的解决方案
否则就是骗钱糊弄人
烘焙后效果会好很多
但和实时光线跟踪比还是各有胜负
例如UV接缝会带来光照错误
实现实时光线跟踪
需要极高的效率
我参考了论文
关于用球面斐波那契点集改善光线跟踪的文章
下图截自上述论文
不需要看完整篇论文
直接使用文中的公式生成点
这分布方式能让渲染更平滑
相当于提升了速度
在画面每个像素的法线方向上半球
根据上面的分布方式发射射线
如下图
红色的部分是没被遮挡的射线
没被遮挡意味着能看到天空
看到天空意味着能被天空照亮
所以
红线比例越大的像素会越亮
这样就能算出天空光的效果
太阳光的反弹也同理
如下图
红色的射线
是能“看到”被太阳直接照亮区域的射线
所以
红线比例越大的像素一般会越亮
这样就能算出太阳光的一次反弹
之所以说一般,是因为还需要考虑光通量
物体表面的法线方向会影响被太阳照亮的程度
至于
为什么这么快?
是因为这一切都是在
像素着色器里完成的
我把场景的包围盒数据传递到shader里
用粗暴的数学方法做射线求交
每个像素只要负责自己的几十根光线
计算量其实跟高精度的模糊差别不大
这种模糊不是连手机界面都有吗
每帧之间的采样方向加了抖动
还加上能混合多帧的TemporalAA
在采样不多的情况下就很平滑了
不就变相减少了采样的数量
还有太阳光的一次反弹
方法与离线渲染器不同
在第一次射出的射线和场景相交后
不会在交点处再次射出射线
而是比较交点位置和阳光shadowmap的关系
从而推算出交点有没有被阳光直接照射到
这样可以大幅减少射线求交计算
效率得到大幅提升
虽然最终得到的效果还是不错的
但是局限还有很多
例如只能和AABB求交
多帧积累也没有好好做
也没有用BVH加速求交
……
所以还不能应用到实际
只能算是一个粗糙的尝试
但至少给大家展示了一些有趣的可能性
也请图形大神轻喷
代码就不贴出来了,放公众号显得臃肿
相比我这个业余粗糙的尝试
有团队早已做成产品级的应用
他们攻破了重重难关
在实时渲染里完成间接光等复杂的计算
有请今天的主角
一款能提供高质量实时渲染的软件
是可视化软件里冉冉升起的新星
看用户作品就能感受到它有多强
感兴趣的可以去官网找高清大图
因为它确实经得起考验
下面多图截自Enscape官方画廊和论坛
例图品质确实很高
! 甚至强大到像在骗人!
曾有不少小伙伴提出质疑
还有人被某些产品欺骗过
花了钱才知道被坑
下图截自Enscape官方画廊
凭什么VRay要花一小时的图
Enscape能几秒就完事呢?
因为他们作弊了
他们想尽一切办法
加入各种奇葩巧妙的技术
让短时间的质量逼近离线渲染
可谓用心良苦
下图截自Enscape官方论坛用户aekarat
让我来解释下
他们到底如何“作弊”
要知道
光线跟踪计算量是庞大的
所以慢
计算一根“射线”和场景的交点
不是一个简单的过程
需要射线和每个三角面求交
一个常规的室内效果图场景可能有500万面
想想就知道很慢
当然,这是在没有任何加速手段的极限情况
为了让画面平滑
每个像素需要很多射线
只有射线足够多
才能清楚知道周围对这个像素的影响
才能清楚知道这个像素里有什么内容
所以
一张图里像素那么多
而每个像素又需要很多射线
每根射线又要和很多三角形求交
简直就是慢上加慢
但想要有好的画面
又少不了光线跟踪
为了有真实的画面
同时有很快的速度
机智的Enscape团队
结合了光栅化和光线跟踪各自的优点
还在GTC 2017上分享了他们的技术
Deferred Path Tracing
下图截自Enscape在GTC2017分享的演示文稿
光栅化速度很快
但有很多元素没法计算
例如面光源阴影,间接光等
所以
Enscape把能用光栅化计算的部分
都用光栅化计算
例如阴影贴图,漫反射颜色、法线方向等等
下图截自Enscape在GTC2017分享的演示文稿
光栅化实在计算不了的
就交给光线跟踪
例如在镜子的反射里看到了茶壶的金色背面
但是画面里不能直接看到
只能通过背后的镜子间接看见
但又由于光线跟踪很昂贵
所以
只要是能在画面里直接看到的部分
都采用基于屏幕空间计算
例如茶壶的银色正面能直接被看见
所以能像手绘一样
“画”出茶壶下面镜子的反射
不仅是反射
间接光、折射等
都用这样的方式去计算
下图截自Enscape在GTC2017分享的演示文稿
最终把两者合在一起
下图原图截自Enscape在GTC2017分享的演示文稿
让高品质的实时渲染成为可能
像下图那样的天空光照明
以往只能在离线渲染器里出现
下图截自Enscape官方论坛用户HDD
为了进一步改善
Enscape还有很多
很用心的功能和细节
例如渲染太阳光的反弹光时
计算射线交点和阳光阴影贴图的关系
这样能节省很多性能
我蹩脚代码的阳光渲染也是从这里学到的
下图截自
在采样时
为了保证采样足够多
同时保证画面流畅不卡顿
Enscape把采样分布到多帧
这样每帧需要的样本就很少
画面就很流畅
下图截自
Enscape的雾浓度
会直接影响丁达尔效应
很讲道理
用户完全不需要操心复杂的参数
因为有常识的人都知道
雾浓了才会出上帝之光
Enscape自带天空系统
能模拟较真实的日照变化
也能导入外部天空贴图
下面俩1080p视频平均每张图渲染时间才0.2秒
还有
Enscape默认就有屏幕空间接触阴影
解决因阴影贴图分辨率不足带来的浮空
在用户感知到问题之前就已经解决问题
Enscape有Revit,Rhino,Sketchup插件
视口能和建模软件同步更新
能把项目打包成独立运行的exe
放在任意电脑上观看
还能上传到网上
直接在网页上查看项目
可见Enscape团队还对webGL做了专门的优化
还支持VR观看
支持全景图输出
支持视频输出
……
等等
虽然还有一些问题
从刚面世到现在
Enscape进步巨大
功能越来越完善
画面也越来越好
尽管画面还比不上离线渲染器
但Enscape在速度上远超它们
非常适合快速预览设计
Enscape用自己的技术方案
真真正正地缩短了可视化流程
非常有追求
期待以后的进步
在RTX实时光线跟踪出来之前
他们早已经做到了
高品质的实时渲染
可见是个技术过硬的团队
绝不是忽悠人的
如果集成RTX
只会更强
现在有RTX了
光线跟踪效率有很大提升
实时画面变得更好
最近GDC就有不少劲爆的演示
例如Quixel用UE4制作的实时短片Rebirth
非常推荐去看4k原片
下图截自
还有Unity的实时短片The Heretic
1440p30Fps运行在一台消费级电脑
非常惊艳
下图截自
前阵子还听说
有国产可视化软件集成了RTX
能实时呈现逼真画面
而且RTX也即将支持老显卡
大伙可以享受新技术带来的便利
我相信
只要是有技术有追求的团队
肯定能带来真正有用的工具
如果本文有技术性错误
还请各位神仙指点小弟
其实本文应该早两个月推送
无奈真的没时间
文中Enscape测试图均用Enscape2.4试用版输出
参考资料和论文
请登录之后再进行评论