图形 2.2 模型与材质基础

模型与材质基础


 

图形渲染管线

 

图形1.1 渲染流水线

顶点数据(Vertex Data[])

顶点着色器(Vertex Shader)

形状(图元)装配(Shape Assembly)

几何着色器(Geometry Shader)

光栅化(Rasterization)

片段着色器(Fragment Shader)

测试与混合(Tests And Blending)

 


 

模型的信息

 

顶点连接成线,线连接成面,面组成为模型。

模型虽然是3d的,但是模型表面是2d的,把模型表面展开在一个范围为(0-1)的坐标系中,坐标的横轴为u,纵轴为v,那么每个顶点都能用uv坐标来找到贴图所储存的信息。展开后的uv能在substance painter绘制贴图(漫反射贴图、法线贴图、高度贴图、金属度贴图、AO贴图)。

模型文件有很多种格式:3ds、obj、fbx、c4d、ma、dae、stl等。以obj格式的文件为例子,这个文件包含了:

V 顶点坐标数据(模型空间中单个顶点的XYZ坐标)

VT(texcoord)纹理坐标(水平方向是U,垂直方向是V)(当然,范围是0-1之间)

VN(normal)顶点法线

顶点色(单个顶点的RGB颜色信息)

一个顶点包含了法线、纹理坐标、顶点色等信息。

obj文件格式和fbx文件格式的差异:

 


 

材质基础

 

在现实世界里,每个物体会对光产生不同的反应。比如说,钢看起来通常会比陶瓷花瓶更闪闪发光,木头箱子也不会像钢制箱子那样对光产生很强的反射。每个物体对镜面高光也有不同的反应。有些物体反射光的时候不会有太多的散射(Scatter),因而产生一个较小的高光点而有些物体则会散射很多,产生一个有着更大半径的高光点。

 

不同的材质决定了不同的光照表现,这意味的材质的本质就是BRDF(双向反射分布函数)。

 

漫反射

漫反射是最容易模拟的模型。比如现实中的石头,水泥,砖块等。

最简单的Lambertian很简单粗暴的认为光线均匀的反射出去

Diffuse = baseColor *LightColor * dot(LightDir , Normal);

 

镜面反射

光滑镜面反射。

镜面反射就是将入射光线根据表面法线进行反射,并且只有在反射方向有能量,其他方向能量均为0。

Specular = pow(saturate(dot(ReflDir,ViewDir)),32) * LightColor; 

 

折射

对于玻璃这种电介质,除了反射之外还有根据物体的折射率折射一部分光线进入物体之中

反射和折射能量的多少是根据菲尼尔定律决定

R = refract(View,Normal,ration);   ReflColor = tex2D(skybox,R);

 

粗糙镜面反射

法线偏移较小。反射依然集中在一个区域。

形成磨砂的质感。

 

粗糙镜面折射

这种材质在现实中的例子就是各种毛玻璃

 

多层材质

涂了透明油漆的木地板使得折射进去的光线再做一次反射折射的判定。

 

次表面散射

光进入皮肤后与照亮了毛细血管,进入物体内部后多次反射,再反射出去。

因此在明暗分界的位置,反射出的红光就更容易被看到。

这种次表面散射在半透明的物体例如玉石、蜡烛、牛奶、皮肤上更容易出现。

 

那么我们要如何模拟这样平面来改变材质表面呢,现实世界中不存在完美平滑的表面,因此需要对模型表面的法线进行扰动,其中一个方法是使用法线贴图。漫反射,高光,折射。都与法线有关,因此改变法线,就能改变其光照计算结果。

虽然材质特别重要,但是没有一个好的模型,依然不会有好的效果。有时候模型就能表现出它的金属感,布料感。材质在这些基础上就能给人一个更加直观的感受。

 


 

模型数据在渲染中的作用

 

1.顶点动画—在顶点着色器中,修改模型的顶点位置。进而达到模型运动的效果。顶点着色器计算的是模型的每一个顶点,每个顶点的数据是不同的,因此同一个计算公式在不同的顶点上,计算出来的结果也是不同的,且需要顶点数量足够多效果才会好。在一些DCC软件中K帧也是一种顶点动画。

2.纹理动画—在片段着色器中,修改模型的UV信息,使得采样贴图时,发生位移而产生运动效果。比如利用法线贴图,改变反射与折射的朝向,改变UV采样点的位置,产生动画效果。不过修改的只是法线信息,因此其他数据还是保持修改之前的样子。

3.顶点色—在渲染时,影响输出结果,控制颜色范围,像罪恶装备的卡通渲染就使用了这种技术,改变了人物身上阴影的范围。也可以用于遮罩蒙版从而对模型分开渲染,分别处理光照结果。

之前,在解决描边断裂的问题的时候(没有平滑法线,没有模型光滑组,从而法线外扩时就会使得描边断裂),想要用别的方式来处理这个问题所以特地搜了一下相关解决的办法,发现也有用顶点色来通过计算从而获得平滑法线后得出描边结果。

实际上模型光滑组能直接将相邻平面的法线进行平滑插值,这样就能解决模型着色僵硬和断裂的情况了。

 


 

顶点色与顶点法线

 

想在Maya中绘制顶点色可以使用:

FragColor = FinalColor * VertexColor; 

这个公式。

不过因为四边面本质还是三角面组成的,所以绘制的时候会出现三角形的分界。

三角形内的像素点的色彩会在光栅化阶段进行插值混合,而插值的原理则是根据重心坐标来进行计算。

三角形中的重心坐标的计算方式:

插值操作是在光栅化阶段进行的,所以这些XY坐标可以理解为屏幕坐标。

点D的真实坐标为(x,y) 重心坐标为(α,β,γ),该点是三个顶点直角坐标的线性组合,系数之和为1 每个系数都是非负的。

重心坐标计算完毕后,这样我们就能根据重心坐标来做颜色插值了,比如重心本身的颜色。我们可以得知重心坐标为(α,β,γ)中,α+β+γ=1,那么这三个变量可以轻易得出都是1/3,即重心的颜色就是各点颜色的1/3的总和。

 

顶点信息除了用顶点色表示,当然也包含顶点法线。法线的表现方式包含面法线和顶点法线,面法线本质上还是顶点法线,只是储存方式不同。

面法线与顶点法线:

面法线未使用平滑时,三角形三个顶点共用一个法线。那么插值时,因为三个顶点的法线相同,所以插值的结果相同,最后使得面上每个位置的法线位置都是一样的。

顶点法线使用平滑后,一个顶点一个法线。三角形三个顶点的法线也就不相同。插值结果,也就会不同。

 


 

关于描边的扩展

 

在NPR渲染中。通常在顶点着色器中,将顶点往法线方向偏移。然后再片段着色器中直接输出一个颜色,达到描边的效果。BackFacing描边时,线条之间断开就是因为没有使用顶点法线(没有进行平滑着色)。

 


 扩展作业

 

——顶点色还能做什么?

  在渲染时,影响输出结果,控制颜色范围,像罪恶装备的卡通渲染就使用了这种技术,改变了人物身上阴影的范围。也可以用于遮罩蒙版从而对模型分开渲染,分别处理光照结果。

  之前,在解决描边断裂的问题的时候(没有平滑法线,没有模型光滑组,从而法线外扩时就会使得描边断裂),想要用别的方式来处理这个问题所以特地搜了一下相关解决的办法,发现也有用顶点色来通过计算从而获得平滑法线后得出描边结果。

——模型光滑组对法线有什么影响?

  模型光滑组能直接将相邻平面的法线重新进行平滑插值,这样能解决模型着色僵硬和描边断裂的情况。

 


 

参考

 

【技术美术百人计划】图形 2.2 模型与材质基础

GAMES101-现代计算机图形学入门-闫令琪-Lecture 17 Materials and Appearances

 

跳转回百人合集

posted @ 2022-01-08 23:37  anesu  阅读(58)  评论(0编辑  收藏  举报