【前言】 模型建立好了以后,通常都要赋予材质,这意味着给这个模型对象(这些模型本质就是一个由面组成的空壳)赋予了表面的属性,用于计算模拟真实的物理效果。
听说过“三分模型七分贴图”的说法吗?模型制作的再好(当然它是基础),如果没有纹理贴图,那它也缺少表面的细节,更缺少“灵气”和“神韵”不是吗?也就是大家所说,没有质感。
质感是什么?光线照射物体所表现出来的视觉效果。在三维软件中是通过设定材质、灯光、阴影和环境等要素,由渲染器调用不同的着色器进行渲染(模拟计算),对视觉形态的再现的过程。
说到渲染(Render)涉及很多要素,这里为了将来学习纹理绘制打基础,所以简单谈谈材质、重点研究学习贴图原理和应用。下面我以CG人能理解的方式进行研究,尽量回避数学算法。(太深了,我也不会,嘿嘿)
【研究】
一、明确几个概念:
1、 渲染 Render: 使用软件从模型生成图像的过程。说白了就是把三维场景特殊数据格式计算,转化为位图图像或图像序列的过程。(XYZ到XY,从三维到二维)。
2、渲染器(renderer) : 渲染工作是通过渲染器完成的。是实现渲染的特定算法(mental ray ,vray,Arnold)。主要两类:一个光线跟踪,一个是光能传递。每个独立渲染器都有适合自己的材质和灯光,当然它也支持它所依赖的三维环境的标准灯光和材质,但效果没有它自己的好。
3、着色器(shader) 是一组提供计算机图形资源在执行渲染时使用的指令,负责计算目标颜色。分为定点着色器,几何着色器,像素着色器等,应用于GPU流水线的。在一般情况下,着色器是可以直接在图形处理单元(GPU)上运行的程序。换句话说,着色器类似一个汇编程序。你可以通过使用汇编编程的CPU,你也可以使用顶点和像素着色器的GPU编程。
糊涂了吧? 说白了Shader(着色器)实际上就是一小段程序,它负责将输入的Mesh(网格模型)以指定的方式和输入的贴图或者颜色等组合作用,然后输出。绘图单元可以依据这个输出来将图像绘制到屏幕上。输入的贴图或者颜色等,加上对应的Shader,以及对Shader的特定的参数设置,将这些内容(Shader及输入参数)打包存储在一起,得到的就是一个Material(材质)。所以说Shader并没有什么特别神奇的,它只是一段规定好输入(颜色,贴图等)和输出(渲染器能够读懂的点和颜色的对应关系)的程序。而Shader开发者要做的就是根据输入,进行计算变换,产生输出而已。C4D中已经由官方开发好了的Shader为你服务,等你调用。如果你对渲染效果不满意,总想渲染出自己想要的风格,而这些现成的Shade又满足不了你,怎么办?有能力自己写一个吧!
二、C4D材质
第一部分:材质(Material) 用来表述物体表面所呈现的颜色、光泽、透明度、凹凸、反射等属性的着色器集合。C4D基本材质的各个通道就对应着物体的不同属性的数据描述。(描述材质实际上是只是一种材质函数,全名为BRDF(Bidirectional Reflectance Distribution Function)双向反射分布函数,数学上,完全的材质函数应当是BxDF,即包括了反射透射等等所有的效应。因此BRDF只是BxDF的一种,除此之外,还有透射函数,散射函数等等。但考虑到我们处于实时的框架下,故近似为BRDF,忽略其他的BxDF。)
通过材质各个通道的属性来模拟描绘现实世界的不同物体。
第二部分原理:
材质的各种属性是如何模拟现实的光学物理现象的呢?这必须从物理学上谈起。
一、光与物质的交互
光是一种横向传播的电磁波,电磁波的波长范围非常广,但只有390~760nm之间的一段波谱是人眼可见到的,也就是在图形学里对渲染着色起作用的部分。另外因为光有波粒二象性的缘故,有时候我们在图形学里也会把光做为光子(photon)来处理。
1、当光投射到传感器(眼睛,照相机等)上时,颜色和亮度就会被吸收并感知,而光与物质交互后被感知的,就是物体的颜色。
2、均匀介质
内部密度相同的物质,意味着它有唯一的折射率,对应透明的均匀物质来讲(如水,玻璃),光通过时,并不会改变光的颜色或强度。
3、光被吸收(absorption)。
而当物质对某一种可见光谱有吸收率的时候,那么,光就会随着在物质内的传播距离而逐渐被吸收,而光的方向并不发生改变。
4、非均匀物质
当非均匀物质内部的折射率非常突然的时候,这时就会发生散射(Scattering)现象,光会被分割为多个方向,但光的总量并不会发生变化。
5、自发光”emission“。 物质还可能因为其他能量发出新的光。
总之,光与物质交互的三种方式,吸收,散射,发光。
二、光与平面的交互
光与物质交互发生在物体表面时,关于光与空气和物质之间的散射效果。这个时候平面散射光会分为两部分:一部分进入平面的部分(折射,在物体内部传播中被吸收或散射),另一部分从平面出去的部分(反射)。
1、镜面反射:一个假设完美无限光学平坦的平面(简称光学平面)反射效果,平面两侧的空气和物体有各自的折射率。(注意模型底下反射的是地面)
2、非镜面反射:但实际上,平面大多都不是光学平面(除了镜子或镜头等),而是一种微几何体(Microgeometry),表面都会有一些比可见光波长要大的不规则凹凸,但又小到无法覆盖一个像素或者采样点,所以,我们就把这种非光学平面。
3、光滑 roughness
平面相对平滑时,表面方向的变化也比较轻微,从而反射光的方向变化也较小,有了较清晰的反射。而下面的表面粗糙,表面方向的变化范围也较广泛,反射光的方向变化也比较大,出现了模糊的反射。
4、漫反射光与镜面光(diffuse and specular)
从平面直接反射的部分称为镜面反射光(Specular),来源于拉丁语的“Mirror”,镜面光的颜色,通常就是灯光的颜色,只有照射在金属上才会改变颜色(实际是金属吸收了特定波长的光),传入到物体内部,而经过折射,被材质吸收(转变为热能),或者内部进行散射,一些散射光最终会重新返回从平面折射出来,并被摄像机或眼睛所捕捉到,称为漫反射光(Diffuse)。
漫反射光被物质吸收并散射后,会成为不同波长的光,这也就给予了物体颜色,比如物体吸收了蓝色以外的光,那物体就是蓝色的,而因为散射的混乱比较均匀,从每个方向看起来都是一样,所以这点和镜面光不一样。也可以使用这个名字albedo来描述。
5、金属和非金属
物体内部的折射光的作用,取决于物体内部的组成,内部组成的不同,可以分为,金属(metal)导体,电介质(Dielectrics)绝缘体和半导体(Semiconductors ),在处理物体时简单的分组为金属和非金属就可以了。金属会吸收所有的折射光,而且通常会被绝缘体的反射率要高,通常的反射率要达到60%~90%,而绝缘体则是0%~20%,反射率高,就防止了入射光被吸或折射,这样,金属就有了”闪亮“的外观。
金属的折射光能量都立刻被自由电子吸收,而非金属(绝缘体),光会在内部进行吸收和散射活动,最后,一些折射光会通过散射,重新从入射平面反方向射出
6、非金属的折射光会进行散射
导体的反射会跨越光谱,所以反射是有颜色的,虽然颜色反射在导体里比较罕见的,但在一些日常的材质里(金,铜,黄铜)还是可以看到这种效果,而绝缘体的反射通常是他们的本来颜色,因为金属会吸收所有的穿透光,也就没有任何漫反射(diffuse)部分,但金属氧化的部分和一些表面残留物还是会散射少量的光。不同材质的漫反射颜色,金属为0。
7、次级表面散射(Subsurface Scattering)
从前面的图中,可以看到折射后的散射光从平面不同的点发射出来,和原始的入射点的距离也各不相同,可以统称为次级表面散射光,根据散射出的距离和入射点像素的大小的关系,可以分为两种情况:
如左图所示,当像素的尺寸大于入射到出射点的距离时,这个距离就可以被忽略,可以认为这个平面散射出的光和入射光是在相同点上,也就是右图的样子,也就是我们常说的漫反射。
当像素小于出射到入射距离时,每个点的着色就会收到其他光入射到其他点的影响,也就是常说的“次级表面散射”技术,很重要的一点是,它和普通的漫反射着色是一种物理现象(都是折射光的次级表面散射),唯一不同的就是散射的距离与观察点大小的关系,一个通常被认为是“次级表面散射”的表现,当在较远的距离观察时,就可以被认为是漫反射着色(例如远距离角色的皮肤),而“正规的漫反射着色”在很近距离观察时,也会有次级表面散射的效果。
8、Fresnel现象
菲尼尔表现的是材质的反射率和入射角(也就是光源入射向量和平面法线向量的夹角)的对应关系,也就是说,入射光的角度越大,反射率也会越强。以水面为例,正常入射事只有3%的反射,而水平时则几乎到100%。
下图是水折射的菲尼尔现象,看近处和远处对比。离观测者越近折射越强烈,越远越模糊。
下图是水表面反射菲尼尔现象,离观测者越远反射越强烈,越近越模糊。
8、各向异性
前文已经提到了表面的微几何体。从宏观来看,在我们渲染模型网格时,使用凹凸贴图或法线贴图就可以描述表面小的细节。 但还是有一些微小的凹陷,裂缝或突起,而用肉眼是很难看清楚的,而且这些微几何体是有规律分布的,它小到连正常大小的法线贴图也无法来表现,虽然肉眼无法看到,但这些微观特征,还是对Diffuse和Specular产生了影响。光虽然向四处反射,但是有规律的,在模型表面有的地方强,有的地方弱,有的没有,这就是各个方向不同。
第三部分材质和通道的优先级:
C4D标准材质的各通道计算的优先级,一般是从上到下。先计算颜色通道,然后再计算漫射通道,依次类推,这样最后显示的结果,却是后计算的通道要影响先计算的通道效果。仔细看下图:
1、颜色通道设置为红色,其他不勾选,渲染器计算,最后显示结果,当然是红色。
2、如果再勾选漫射通道,为其添加一个噪波贴图(SHADE程序贴图)。渲染器先计算颜色通道为红色,后计算漫射通道的噪波,显示的结果是后者影响了颜色通道红色的显示,你也可以简单理解这是一种层与层之间的混合覆盖。
3、如果继续勾选发光通道,参数设为实用。那么最后计算的结果,它把前两个通道的效果全部覆盖掉了。
4、再继续勾选透明通道,把亮度设为100%,它的影响简直是太大了,全部透明。也就是说颜色、漫射、发光通道计算完之后,没有被显示,最后显示的是透明通道的结果。但是CPU的活还是干了。
5、不选择透明,勾选反射,你会发现它的影响也是很大的。颜色、漫射、发光通道白忙活了,但是CPU的活还是干了。
6、勾选环境通道,它其实是一个优化计算方法。它是假的反射,特点速度快,缺点是假。在其纹理通道载入一个贴图,它就会显示反射的样子。如果你勾选反射通道,它就不显示。如何同时显示呢?仔细看图就知道了。
(答案:把发射通道的衰减一定设为添加)
7、继续向下勾选烟雾,它的影响也不小啊。虽然它是最后计算的,但效果覆盖掉了上边其他通道的效果。
8、勾选凹凸通道,添加一个噪波文件。它影响上边的各个通道,颜色、高光、反射通道。