其他
Unity教程|立体渲染之Raymarching
在立体渲染(Volumetric Rendering,为保持一致,本系列译文均称立体渲染)系列第一篇文章——Unity教程|立体渲染中,我们简单介绍了立体渲染的基本概念。对立体渲染不太熟悉的开发者,请先查阅第一篇文章。
尽管传统着色器只能渲染材质的外壳,但还是有办法让光线穿透到材质内部的几何体,创造画面的深度。Raymarch就是最常用的技术,第一篇文章使用Raymarch技术在立方体内绘制了一个红色球体。本文将深入为大家介绍效率更高的Raymarch实现方案。
下文将提供raymarch函数的多种不同实现。
固定步长的Raymarch在立体渲染系列文章第一篇中实现的Raymarch就使用了固定步长(Constant Step)。每一束射线都会沿视线方向延伸STEP_SIZE的长度,直到击中目标为止。上篇的示例将目标绘制为红色,而其他部分为白色。
固定步长的Raymarch可以通过下列代码实现:
上篇已经看到其渲染结果是看起来像平面的几何体:
我们需要一种方法来估算射线在遇到几何体之前到底要走多远。这就需要估算射线到达几何体的距离。上一篇文章中用到了sphereHit函数,它可以判断一个点是否存在于某个球体内:
对其稍作修改,将返回值从布尔值修改为距离:
sphereDistance能做的就是提供一个保守的预估距离,告诉我们射线在到达球体之前还要前进多远。不过如果没有进行适当的着色,立体渲染的结果还是比较单调的。本例中只渲染了一个球体,看起来似乎不重要。但如果使用更复杂的几何形状,这个技术就非常有价值了。下图(取自Distance Estimated 3D Fractals,经过距离估算的3D分形)呈现了Raymarch的工作原理。每条射线都会走过到达最近物体的距离。通过这样的方式,就可以大幅减少射线命中渲染体所需的步数了。
为了更好地理解它的工作原理,将表面着色替换为渐变色,来表示Raymarch命中几何体前究竟需要多少个步骤:
下一篇文章将着重介绍使用距离函数创建基本几何体的方法,以及如何组合这些几何体以便得到您想要的任意形状。
本系列共有四篇教程,本文为第二篇,后面将继续更新,请保持关注。
本文来源于:alanzucconi.com
原作者:Alan Zucconi
更多实用Unity相关的技术文章:
Vision VR/AR Awards 2017大赛即将启动,亚洲区率先开启作品征集!
Unity全球两大VR大师齐聚北京,带来2016年最后一场纯技术VR Master Class!
备受行业瞩目的VR/AR行业大会Vision VR/AR Summit Asia 2016即将在北京召开(轻触图片了解详情)!