Unity立体渲染系列教程链接:

Unity教程|立体渲染(一)

Unity立体渲染(二)|Raymarching

Unity立体渲染(三)|表面着色


本文是立体渲染的第三篇,本系列教程全集:
第一篇:立体渲染。介绍立体渲染的概念以及在Unity中如何实现立体渲染。 第二篇:光线追踪。文章着重说明如何实现距离辅助的光线追踪,这是是渲染立体的事实性标准技术。 第三篇:表面着色。全面指引如何逼真地进行立体着色。 第四篇:有向距离函数。一篇对于数学工具更深入的讨论,让我们能制作和组合任意几何体。

本文将解释如何用实际可行的方式对立体进行着色。关键步骤是如何让通过Raymarch技术生成的无光照的平面具有三维效果。

125617paoloasfqmbh4zal.png

实现simpleLambert函数如下:

125617w1n7nn1tjt1wcn1j.png

该函数以表面法线作为输入;所有参数将通过Unity提供的着色器的内建变量获取(你可以在这里找到完整的列表)。只有高亮的一行真正用于计算Lambertian反射。

法线预估
这篇教程背后的主要思想就是将Lambertian反射应用到立方体内虚拟的几何体上。所选的光照模型并不取决于到光源的距离,但需要知道待渲染表面上的点的法线方向。

这不是一个容易完成的任务,因为用于球体的距离函数没有包含这样的信息。在代码大师Íñigo Quílez的体积渲染完全指南(这里)中,建议使用某种技术来预估法线方向。他的方法是对周围点的距离场进行取样,来估算局部表面的曲率。如果你对梯度下降法很熟悉,下面就是梯度预估步骤:

125617r4j7f11de6nqe4hj.png

在X轴方向上的差值计算的是通过估算点右侧距离场与左侧距离场的差距来计算的。我们可以将这个方法应用到Y轴和Z轴上,并将其正规化为单位向量:

125617xyd1yyajgodbujz1.png

这个法线预估引进了新的参数eps,表示用来计算表面梯度的距离。这个技术假定我们所要着色的表面相对平滑。不连续平面的梯度将不会正确接近要着色的点的法线方向。

着色
目前为止Raymarch代码都只管是否命中。现在要返回立体表面上被命中的点的颜色:
125617sqd5rkdffttznk95.png

这个渲染表面的函数将会计算法线,并将其传入Lambertian光照模型:

125618w7xzwfg3xw04iimx.png

这些简单的修改已经可以用来创建非常逼真的效果了:

125618t500h3axqekeh7fh.png
125618iq22kk2s22x22lq7.png

变量 控制了镜面反射的尺寸和范围,而 指明了反射的强度。为了实现更好的效果,我们需要使用更有趣的几何体。为了以示区别,下图只有右半部分使用了镜面反射:

125620ws6e5s9alcws6ah5.gif

结论
本文展示了如何使用距离辅助的Raymarch着色器来模拟立体形状的真实光照。Lambertian反射和Blinn-Phong光照模型都可用于对物体进行逼真的着色。这些技术都是Unity 4引入的最先进的实时光照模型。你也可以实现自己的光照模型更加深入地探索这一概念。

Unity, shader, 表面着色, 立体渲染锐亚教育

锐亚教育 锐亚科技 unity unity教程