质感是什么?光线照射物体所表现出来的视觉效果。在三维软件中是通过设定材质、灯光、阴影和环境等要素,由渲染器调用不同的着色器进行渲染(模拟计算),对视觉形态的再现的过程。
说到渲染(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、勾选凹凸通道,添加一个噪波文件。它影响上边的各个通道,颜色、高光、反射通道。
9、下边这个更厉害,阿尔法通道。
10、辉光实际上是后期渲染运算。它的效果影响上面的各个通道。
以上,简单研究一个材质的各个层之间的相互影响。
不同的材质如果赋予一个模型,在渲染的时候如何呢?
12、建立三个材质,红绿蓝。
13、把它们都赋予一个模型球体。渲染结果会是什么呢?渲染器的计算的优先级是从左到右,那么最后的显示效果一定是右侧的蓝色了。因为这些材质都不透明,也没有阿尔法通道,他们之间也没有设置混合运算。最后计算的蓝色就会覆盖前面的。
14、测试一下,果然如此。(场景中没有用灯光,用全局光渲染,场景是HDRI贴图照亮的)
三、C4D贴图
才说道重点。
为什么要用贴图?虽然材质定义了物体表面的颜色、光泽、透明度、凹凸等属性,但各个通道中的设置:一是非常简单,二是它是对整体进行控制的。对于模型不同地方不同的属性,很难描述复杂情况。所以用贴图来实现对复杂世界的描述。
贴图(Texture 或Map),在C4D中其实就是一种SHADE。在标准材质的各个通道,除了有基本属性设置之外,几乎都有一个纹理通道,可以填充可以是texture或shader。
1、Texture(纹理)通常与2D 位图图像或图像序列(视频)相联系。而2D图像有一些局限性,因为它们依赖于图像的精度。所以当一个物体的贴图精度较低而渲染出的图要求精度较高时,纹理贴图会不清晰或不真实,因为它是由一个小的图拉伸而来的。(其实它也是通过SHADE载入的)
2、 Shader也就程序纹理,是一段程序生成的。它的精度可以由参数决定,在渲染时按照灯光、环境等因素计算呈现效果。一是不会产生上述精度的麻烦,二是能够随着环境而变化。
它分为2Dshader 3Dshader。2Dshader 似于2D图像纹理。除了没有精度问题,它在物体上的投影方式与2D 的图片一样有平面、柱体、球体等。它依据U、V 将图片投射在物体表面。3Dshader 可以在真实的空间中分布,因为它是基于U、V、W 三个坐标方向的,W 给了3D shader体积感。由于3Dshader使用UVW 投影,所以它不会拉伸或扭曲。3D shader 是面对复杂物体时,代替2D texture 和2D shader 的最佳方案。
3、Shader包含Channel shader和Volumetric Shaders 。
一是Channel shader:
可以被材质的某个单独的通道载入。如噪波、菲尼尔等。这些shader 被称为通道shader
噪波是通道SHADE,它是程序纹理,可以通过参数控制纹理的形态。
通道SHADE 所在的位置:
二是Volumetric Shaders :
C4D 有一套内建的高级shader包:volumetric shaders,它们增强了C4D 的材质系统。volumetric shaders也包括了2D 和3D 的shader,它们提供了高级的特别控制用于制作基本材质无法做到的效果,如金属表面的刮痕,真实的透明、半透明等。 它们如材质一样独立使用,不能被标准材质载入纹理通道使用。
位置在于:
官方帮助截图:
1、玻璃材质
多么好的材质,怎么就不用呢?初学者总是用标准材质费劲调试,效果也不见得比这个好。
个人理解总结如下:
程序纹理Shade:能够生成一个变化纹理的着色器,又能保持图像精度,如表面里的木纹、大理石、星空等等,可以通过参数改变形态。
功能性Shade:该Shade不能直接生成程序纹理,有的如PS滤镜,对纹理起着调整和混合作用;有的有管理作用,如图层、过滤等是泛称。
举例子说明,如下所示:
1、在材质的凹凸通道中添加一个噪波,这是一个程序纹理Shade。
2、在此基础上,在添加一个图层,这是一个功能Shade(我这么叫)。
3、点击图层,进入再点击着色器(Shade),再添加一个棋盘(程序纹理Shade)。
4、然后,改变混合模式为变暗。
5、这个图层所起到的作用就是“功能性”的,如同进入PS一样,处理多个纹理进行混合管理,再生成一个新的纹理。
【后记】
1、这些知识是我学习的心得,不一定完全正确。但我认为任何一个CG培训的老师如果进行渲染教学,首先应该谈光的物理原理,然后谈渲染器利用材质是如何模拟的,这个真是很重要。
追本溯源,才能融会贯通,最后才能随心所欲不是吗?
如果纹理贴图的原理你都不知道,你还想学“纹理贴图的绘制“,那简直是笑话!
2、通过上面的学习,知道纹理贴图重要,那又如何学习呢?
首先热爱生活,观察自然真实的物品。现实的物品,没有那么完美的,总有污垢、破边、划痕、锈迹等等,仔细观察,并用手机拍照收集,金属如何、塑料如何、布料如何?石头砖墙如何?然后想想,在三维软件中,利用什么样的贴图来表现这些细节,做到优化;如何用材质的属性和参数去模拟表现它。找个简单的模型一遍遍测试,不断调整。渲染的是个慢功夫,非常耗时间,所以,你必须能坐住凳子才行啊!千万不要“乳胶漆”参数如何如何,瓷砖参数如何如何,死记硬背,这样的确可以速成,但削弱你的独立和再创造性。
这是我的自学心得:日积月累,你的功力就会大增,游刃有余。