模型的实现原理
点连接成线,线围成面,组成多边形,至此一个模型空间下的模型形成。
UV
UV如同一个矿泉水瓶,将它划开。平铺在一个二维的坐标系中。瓶子的每个位置(模型的每个顶点),在三维空间和二维空间中都能一对应。在二维坐标系中的顶点对应的位置就是顶点的纹理坐标,因此每个顶点都能利用纹理坐标获取到贴图所存储的信息。
在建模软件中进行UV展开UV会放在一个横向为U纵向为V,范围(0-1)的二维坐标系中。展开后的UV在SP中绘制贴图(漫反射贴图、 法线贴图、高度贴图、金属度贴图、AO贴图)。
一个模型包含的信息(OBJ文件):
- V顶点坐标数据(模型空间中单个顶点的XYZ坐标)
- VT贴图坐标(水平方向是U,垂直方向是V范围0-1之间)
- VN顶点法线
- 顶点色(单个顶点的RGBA通道颜色信息)
OBJ格式与FBX格式
材质基础
有些物体反射光的时候不会有太多的散射(Scatter),因而产生一个较小的高光点;而有些物体则会散射很多,产生一个有着更大半径的高光点。
- 漫反射
兰伯特模型:光线均匀反射出去
Diffuse = baseColor *LightColor * dot(LightDir , Normal);
- 镜面反射
Specular = pow(saturate(dot(ReflDir,ViewDir)),32) * LightColor;
- 折射
R = refract(View,Normal,ration);
ReflColor = tex2D(skybox,R);
- 粗糙镜面反射
法线偏移较小,反射依然集中在一个区域,形成磨砂质感。
- 粗糙镜面折射
毛玻璃
- 多层材质
涂了透明油漆的木地板
- 次表面散射
半透明物体,如玉石、蜡烛、牛奶、皮肤。
多层皮肤模型:
我们把皮肤看成三层,油脂层(微量,很薄),表皮层,真皮层。正是因为有油脂层,因为油脂层直接把光反射出去,所以皮肤上才会有高光产生,没有被反射的光通过折射进入子表面层,光进入这些层之后部分被吸收(获得颜色)和散射,再从皮肤中入射点附近的出射点射出。这个过程就产生了次表面散射的效果。
模型数据在渲染中的作用
1.顶点动画:在顶点着色器中,修改模型的顶点位置,进而达到模型运动的效果
顶点着色器计算的是模型的每个顶点, 每个顶点的数据是不同的,因此同一个计算公式在不同的顶点上,计算出来的结果也是不同的。
2.纹理动画:在片段着色器中,修改模型的UV信息,使得采样贴图时,发生位移而产生运动效果
原理:(1)改变法线,利用法线贴图,改变反射与折射的朝向,由于修改的只是法线信息,所以其他数据仍然保持修改前的状态。
(2)改变UV采样点的位置,从而产生动画效果。
3.顶点色:在渲染时,影响输出结果,控制颜色范围
原理:重心计算
插值操作是在光栅化阶段进行的,所以这些XY坐标可以理解为屏幕坐标。点D的真实坐标为(x,y)重心坐标为(a,β,γ)该点是三个顶点直角坐标的线性组合,系数之和为1每个系数都是非负的。
面法线与顶点法线
(面法线)未使用平滑时,三角形三个顶点共用一个法线。那么插值时,因为三个顶点的法线相同,所以插值的结果相同。
(顶点法线)使用平滑后,一个顶点一个法线。三角形三个顶点的法线也就不相同。插值结果,也就会不同。