计算机图形学入门27:高级外观建模

1.前言

        前面学过模型的外观就是材质,材质就是BRDF(如果对于表面模型来说)。这篇文章详细介绍一些非表面(Non-surface)模型、表面(Surface)模型程序化(Procedural)模型

2.非表面模型

2.1 散射介质

        散射介质(Participating Media)包括雾(Fog)云(Cloud)这些空间中的介质。
        当光通过散射介质的任何一点,它都可能(部分地)被吸收和散射。如下图所示。

        那么,介质对光怎么散射?类比表面物体,只有漫反射(Diffuse)才会均匀的散射到四面八方,同样介质的散射可以用一个函数来描述。

        用相位函数(Phase Function)描述参与介质中任意点 处光散射的角分布。类比BRDF是如何进行反射,而相位函数描述如何进行散射。

        对于如何进行渲染,假如光线传输到某个介质里,光线能走多远取决于介质的吸收能力有多强,比如黑云相比薄雾有更强的吸收能力。当光线停下来的时候,再考虑光线往哪个方向重新导。如下图所示。

        渲染方程不再适用这种体积渲染的情况,自然有其他方程来实现。

2.2 头发/毛皮

2.2.1 头发

        头发(Hair)材质也不是定义在物体表面上的,由于头发是一根一根的,要考虑光线与一根曲线的作用,而不是考虑与面如何作用。

        如上图所示,头发一般有两种高光,一种是无色的,另外一种是有色的。那么这两种高光是如何形成的呢?

        如上图所示,是简单的模拟模型(Kajiya-Kay Model),光线打到圆柱上,有点像反射与漫反射相加,类似Blinn-Phong模型。但是这种方法是不对的,那真实的头发和光线又如何作用的?

        如上图所示,是一个广泛应用的模型(Marschner Model),这个模型考虑了光线打到圆柱上一部分反射,记作R。也有一部分会穿进去发生穿透,再穿透出来,进行两次穿透,记作TT。还有一种到穿透头发内部,在头发内壁发生一次反射,再穿透出去,记作TRT注意:R表示反射(Reflection),T表示穿透(Transmission)。

        Marschner模型原理是将头发当做玻璃圆柱,而头发内部有色素,光线在传播头发过程中会被内部吸收,再传播出去。如果头发是黑的就色素多(光吸收多),如果是金发就色素少。如下图所示。

        Marschner模型综合考虑了三种光的作用(R,TT,TRT),形成了非常逼真的头发效果。

        如果考虑与一跟头发散射叫做单次散射,如果考虑与多跟都发散射叫做多次散射。由于头发非常多,所以计算非常复杂,缓慢。

2.2.2 毛皮

        如果将人的头发材质来描述动物毛发,会是什么效果?如下图所示,左图为头发材质渲染,右图为动物毛发材质渲染。

        可以看出人的头发材质无法准确描述动物毛发,说明不能表示扩散和饱和的外观

        那么人的头发与动物毛发有啥区别?那么,要从生物结构上来分析了,如下图所示。

        首先,从左图所示中可以看出头发和动物毛发都有三个相同结构(Cuticle、Cortex、Medulla)。然后,从右图所示中可以看到动物毛发中间的Medulla要比人类头发中间的Medulla大的多,而Medulla越大,光线越容易散射。所以之前头发Marschner模型没有考虑到Medulla因素是不对的,如下图所示为Medulla加入到Marschner模型中效果。

        根据这种情况,就有人提出了新的模型,叫做Double Cyllinder模型。如下图所示。

        在原来Marschner模型的基础上增加Medulla因素,如下图所示。

        在原来的基础上,添加了两种光线作用(红色),那么一共就形成了5种光线作用分类,如下图所示。

        如下是使用Double Cyllinder模型的例子(狮子王)。

2.3 颗粒状物体

        如上图所示,是一些各种各样的颗粒状模型,也就是颗粒(Granular)材质。这种材质是由一堆细小的模型构成的,所以会非常的麻烦。

3.表面模型

3.1 半透明

        半透明(Translucent)材质在现实中很常见,比如玉石、水母、牛奶、人的耳朵等。光线穿过这些物体内部进行散射,并有一部分光线穿透出去的现象。

        反应到物理上就是光线从一个点进入到物体表面,在物体内部发生散射,再从另外一个点出去。如下图所示。

        为了描述光线这么一种散射方式,把它定义为次表面散射(Subsurface Scattering)

        次表面散射可以理解为BRDF概念的延伸,叫做BSSRDF。BRDF是对点向外各个方向进行积分,而BSSRDF不仅一个点的光线贡献,还有可能另外一个点光线穿过来贡献,所以不仅考虑从各个方向进来的光,还要考虑各个方向进入到其他点的光。因此,渲染方程不仅对方向进行积分,还要对面积进行积分。渲染方程修改如下:

        但是这个计算很复杂,于是人们发现这个半透明现象就好像物体内部出现了一个光源一样,为了物理上的真实,对应上方也有一个光源。所以通过引入两个点源近似光扩散,这样得到的及诶过就很像次表面散射的结果,这就是偶极近似(Dipole Approximation)。如下图所示。

        BRDF与BSSRDF的对比如下图所示。

        对于人的皮肤应该有BSSRDF的性质,才能更接近真实的皮肤。

        如下图所示,使用BSSRDF渲染出的皮肤案例。

3.2 布料

        布料(Cloth)是一系列缠绕的纤维(fiber)构成,纤维通过第一次缠绕成不同的Ply,再进行Ply缠绕会形成线(Yarn)。如下图所示。

        线通过机织针织形成布料。如下图所示。

        对于这种缠绕而成的布,要计算表面材质非常的困难。因为这肯定与线的织法有关系,根据整体织法来计算渲染效果。如下图所示。

        目前渲染布料有以下三种方式。

        1.当成物体表面,然后使用BRDF方式来渲染最终效果,如下图所示。

        但是这种渲染肯定存在问题,因为构成布料的织物分布可能不是一个表面,也可能是一根一根的。所以用BRDF来模拟表面肯定不准确。

        2.当成散射介质。为了更加准确的描述,可以认为这些织物是空间中分布的体积,再划分为细小的格子,每个格子里考虑纤维的朝向分布、复杂程度。然后将这些性质转换为光线的吸收和散射,转换散射介质的渲染。如下图所示。

        但是这种方式计算量非常大,渲染很慢。

        3.当成实际纤维。布料是由纤维缠绕构成,那能不能直接渲染每个纤维呢?当然可以,类似前面介绍的头发渲染,光线需要同每根纤维进行作用,计算量也是非常庞大。

3.3 细节化

        如上图所示,这两张图渲染的结果看起来不错,但是还没有那么真实,因为现实中没有这么完美的细节。而真实的效果往往有很多划痕,高光等不完美的细节。如下图所示。

        解决办法是在材质上提供更多细节的信息,比如修改更加复杂的法线分布。如下图所示。

        通过修改法线分别来添加更多表面细节,这些细节可以用法线贴图来描述,法线贴图分辨率为200K*200K。如下图所示。

        还可以模拟金属材质细节,如下图所示。

        但是,这种渲染加上路径追踪是消耗非常大。因为从相加发射光线到每个微表面上,反射的光线很难打到光源上。反之,同理。如下图所示。

        解决办法是用一个像素覆盖很多个微表面,在这个覆盖的范围内将微表面的法线分布算出来,用来替换原来光滑的分布。如下图所示。

        一个像素覆盖微表面范围的多少,会影响渲染的结果。

        不同类型的法线贴图,得到的渲染结果也会不一样。

        法线贴图还能应用到远处海面的效果。如下图所示。

        那么,这些细节就可以这样解决了吗?当然还不能。因为引入这些细节的时候,用的还是几何光学来解释,而在物理中当物体小到一定程度,光线就不会沿直线传播了,会发射干涉或者衍射等现象,就会产生很多特别的效果。如下图所示。

4.程序化外观

4.1 噪声函数

        程序化(Procedural)外观就是指程序化生成的表面材质,程序化生成是指用一定的方式来指导生成,而不需要真正去生成,可以动态的去查询。

        比如一个花瓶摔碎了,需要看到花瓶内部的纹理细节,这时候就需要使用3D纹理来存储,但是这个存储量非常巨大。所以就什么时候需要用,就去动态查询,就像定义空间中的函数f(x,y,z),给定任何x,y,z的值就可以f的值。这种函数就是噪声(Noise)函数

        使用3D噪声函数来定义模型内部结构和纹理。

4.2 噪声函数的使用

        上图中,为了实现车子的锈迹,给定一张噪声贴图,通过程序获取噪声函数的值,自定义参数来与值做对比来控制是否显示锈迹。伪代码如下。

4.3 噪声函数的应用

        噪声函数应用非常多,比如生成复杂的地形、水面。如下图所示。

        还能查询三维中的纹理,取代3D纹理的作用,比如下图中的工作台木头,从各个方向切割都可以得到木头内部的纹理。

        

  • 13
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

YanisWu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值