请选择 进入手机版 | 继续访问电脑版

查看: 4054|回复: 0

[原创] Unity立体渲染(三)|表面着色

[复制链接]

1169

主题

1869

帖子

2万

贡献

管理员

Rank: 9Rank: 9Rank: 9

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

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



引言
在立体渲染系列教程第一篇——立体渲染中,使用了Raymarch技术在立方体内绘制了一个球体:



这个解决方案只能告知从摄像机投射的射线是否撞到了立方体内的虚拟球体。我们没有任何关于球体位置或方向的信息。因此,我们只能提供一个轮廓。这个结果就是生成一个无光照的扁平球体,难以看出它与圆形的区别。

Lambertian反射
如果想实现带有深度的立体渲染,就需要一个能着色任意几何体的方法。Unity 4中3D物体着色依赖Lambertian反射来实现,Lambertian提供了简单有效的模型来模拟光线在3D表面的行为。Lambertian表面的光线反射数量取决于表面的方向(就是法线方向)以及光照方向。



实现simpleLambert函数如下:



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

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

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



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



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

着色

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



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



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



这种着色方式的优势在于它能对场景中的光照做出反应。这个模型还很简单,但你可以使用更精确的光照技术来加入更多细节。

镜面反射

如果想再进一步,也可以在表面实现镜面反射。这次可以使用BlinnPhong光照模型,更改simpleLambert代码如下:




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



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

下一篇将介绍如何创建并组合基本几何体来生成你想要的任意形状。

原文连接:http://www.alanzucconi.com/2016/07/01/surface-shading/
原文作者:Alan Zucconi
译者:yangtze0621
转载请注明来源:Unity官方中文社区(forum.china.unity3d.com)。请勿私自更改任何版权说明信息。


本帖子中包含更多资源

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

x
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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