一、渲染管线与模型基础
1. 渲染管线
可编程阶段(蓝色区域):
1顶点着色器
2几何着色器
3片元着色器
2. 模型的实现原理
UV:在建模软件中,进行UV展开,UV会放在一个横向为U纵向为V,范围(0~1)的二维坐标系中。
展开后的UV在SP中绘制贴图(漫反射贴图、法线贴图、高度贴图、金属度贴图、AO贴图)
一个模型包含的信息(OBJ文件)
Vertex顶点
Vertex Normal顶点法线
Vertex Texcoord顶点纹理坐标
1V:顶点坐标数据(模型空间中单个顶点的XYZ坐标)
2VT:贴图坐标(水平方向是U,垂直方向是V,范围0~1之间)
3VN:顶点法线
4顶点色(FBX格式才有):单个顶点的RGB颜色信息。一个顶点包含了法线,纹理坐标,顶点色等信息。
OBJ和FBX格式对比
总结下,FBX相较于OBJ多支持了骨骼动画相关的东西,同时也可以存储顶点色和LOD。
二、材质基础
1.漫反射
最容易模拟的模型。比如现实中的石头,水泥,砖块等。
光线均匀的反射出去。
Diffuse = baseColor * LightColor * dot(LightDir, Normal);
2.(光滑)镜面反射
镜面反射就是将入射光线根据表面发现进行反射,入射角等于出射角。
Specular = Pow(saturate(dot(RefDir,ViewDir,32)))* LightColor;
3.粗糙镜面反射
法线偏移较小。反射依然集中在一个区域,形成磨砂的质感。
4.折射
对于玻璃这种介质,除了反射之外还有根据物体的折射率折射一部分光线进入物体中,反射和折射能量的多少是根据菲尼尔定律决定的。
R = refract(View,Normal,ration);
ReflColor = tex2D(skybox,R);
5.粗糙镜面折射
毛玻璃会有这种现象。
6.多层材质
涂了透明油漆的木地板,上层是油漆,下层是地板,同时油漆还会反射上部的物体。
7.次表面散射
半透明的物体,例如玉石、蜡烛、牛奶、皮肤等。
以皮肤为例:光进入皮肤后照亮了毛细血管,因此在明暗分界的位置,反射出的红光就更容易被看到。
8.改变材质表面
现实世界中不存在完美平滑的表面,因此需要对模型表面的发现进行扰动。其中一个方法是使用法线贴图。
漫反射,高光,折射都与法线有关,因此改变法线,就能改变其光照结果。
三、模型数据在渲染中的作用
1.顶点动画
在顶点着色器中,修改模型的顶点位置,进而达到模型运动的效果。
○顶点着色器计算的是模型的每一个顶点,每一个顶点的数据是不同的,因此同一个计算公式在不同的顶点上计算出来的结果也是不同的。
○需要一定数量的顶点,顶点动画的效果才会明显。
○在一些三维建模软件中,动画的k帧也是一种顶点动画
2.纹理动画
在片段着色器中,修改模型的UV信息,使得采样贴图时发生位置而产生的运动效果。
效果:
利用法线贴图,改变反射与折射的朝向。
原理1:
○修改前,使用1这个法线,反射出去的就是1。
○修改后,使用2这个法线,反射出去的就是2.
○修改的只是法线信息,因此其他数据还是保持修改前的样子。
对背部画面采样的部分
原理2:
○改变UV采样点的位置,产生动画效果
3.顶点色
在渲染时,影响输出结果。控制颜色范围。
因为四边面本质上还是三角面组合而成,所以在绘制时会出现三角形的分界。
FragColor = FinalColor * VertexColor;
●可以通过判断顶点色,来做一些操作
○例如,顶点色到达一定的值,就可以做阴影
●Maya中顶点色的绘制
4.重心坐标
●具体可以参考下GAMES101—L9部分
5.顶点与面法线
原理:
面法线
○未使用平滑时,三角形三个顶点公用一个法线,那么插值时,因为三个顶点的法线相同,所以插值的结果相同。
顶点法线
○使用平滑后,一个顶点一个法线。三角形三个顶点的法线就不相同,插值结果也就不同。
平滑/未使用平滑,在模型文件内部存储方式
扩展
在NPR渲染中
○通常在顶点着色器中,将顶点往法线方向偏移。然后再在片段着色器中直接输出一个颜色,达到描边的效果。
○BackFacing描边时,描边线条断开就是因为没有平滑顶点之间的法线导致的。
作业
1.顶点色的其他作用
1.作为一种存储的mask使用(这样可以少使用一张图)
●不想让连上有菲尼尔效应,就把脸涂黑,乘上顶点色
●不想让某些地方有描边,同上
●拿到顶点色后可以做一些其他操作,塞入顶点色的信息必须是线性变化的,如果不是,就要做好精度打折的准备
●可用于预先指定光照、阻光和其他视觉效果
●可以把颜色信息存在顶点里,但是在低模的情况下效果很差。
简单说顶点色相当于一个数据存储的地方,你可以将任何数据塞到此处,然后利用这些数据进行操作,考虑优化时更应注重顶点色的应用。
2.模型光滑组对法线有什么影响
在模型上没有真正的光滑面,也没有真正的四边形面,所有面都是三角形组成的。
平常说的布线合理,拓扑其实是保持两个三角形面的一致性(构成一个四边面的两个三角形面)
①光滑组的含义
下图标出了面的亮度,纯打比方不是确切数字。
光滑组处理面之间的光照信息,提高它们的亮度、饱和度,两面之间的过渡就是两面亮度和平均值。
②光滑组如何计算?
如果一个面的光滑组是1,一个是2,那么他们之间不存在计算。
如果它们光滑组都是1,就会进行光照计算,并且影响最终渲染,也就是说他们光滑组一样的话,就会进行光照计算,产生光滑效果。
下图为不同数值下的光滑效果,数值一致就会有平滑效果。
网格平滑和涡轮平滑:通过增加面,把面分的更细腻来表达曲度。
自动平滑默认所有面的夹角小于45°的进行光滑,默认创建的球面的夹角都小于45°所以都平滑了,下图为数值为10的时候。
③光滑组对法线的影响
法线
●烘焙发现的意义,就是把高模的法线方向,用一张图(RGB)来存储法线信息,存到低模的表面上。贴上法线贴图的低模,就会在视觉上产生凹凸不平、增加细节的渲染效果,从而看起来像高模一样。Normal Mapping法线贴图本质上就是一种图片,只是这样图片的用途比较特殊而已。
●没有光滑组的话,烘出来的法线贴图是一棱一棱的。一般情况华至少也要给一个光滑组。
光滑组(软硬边)和UV对法线的影响
●光滑组相连接的模型,法线贴图都存在打渐变色,导致魔性的法线效果会很奇怪(平面上有法案发凉的光影)。当你发现模型出现这种渐变时,一定是出现了光滑组的问题。
●中间的两个模型出现了不同程度的接缝(第三个模型的接缝非常明显,第二个模型则弱一些)。光滑组和UV统一相连或断开,是不会出现明显接缝的,当遇到解封问题,优先考虑模型的光滑组和UV是否统一。