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

笔记

图形渲染管线

TA百人计划 图形 1.1 渲染流水线
顶点数据->顶点着色器->图元装配->几何着色器->光栅化->片段着色器->测试、混合

模型的实现原理

多个顶点连成线->多条线组成面->多个面组成模型

UV

将模型顶点映射到一个二维坐标中,在二维坐标系中顶点对应的位置就是顶点纹理的坐标。
片段着色器根据纹理坐标查找当前位置对应的纹理信息。

模型UV

在建模软件中进行UV展开,UV放在横向U纵向V,范围(0-1)的二维坐标系中
在展开后的UV中绘制各种贴图

模型包含的信息

  1. 顶点(顶点在模型空间下的x,y,z坐标)
  2. 顶点法线
  3. 顶点纹理坐标(水平方向U,垂直方向V,范围0-1)
  4. 顶点色(单个顶点得RGBA通道信息),Obj文件不包含顶点色

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

obj格式和fbx格式

#obj格式fbx格式备注
多个object支持支持在文件中存放多个三维模型
单object拥有多个材质支持支持
Polygons面支持支持易于被3ds max等软件编辑加工 注:导入到ue4时,必须为三角形面
Normal支持支持
Material支持支持
光滑组(Smoothing Group)支持支持光滑组中的点或面使用平均法线来计算光照,使得整个mesh区域看起来更平滑
uv套数1多套
顶点Color不支持支持导入ue4时,Vertex Color Import Option设置为Replace
ue4 lod不支持支持导入ue4时,勾选Import Mesh LODs
ue4 simple collision支持支持任意凸体碰撞命名规则:UCX_[RenderMeshName]、UCX_[RenderMeshName]_00
socket插槽不支持支持命名规则:SOCKET_[RenderMeshName]、SOCKET_[RenderMeshName]_01
skeleton骨骼不支持支持
skeletal mesh网格不支持支持
animation sequence不支持支持fbx可在文件中存放多个动作序列

材质

material
每种物体表面对光反射表现不同表现出不同的材质(光滑、粗糙等)

漫反射

最容易模拟的模型(水泥、砖块、石头...)。
兰伯特简单粗暴地认为光线均匀反射出去。

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

光滑镜面反射

将入射光线根据表面法线进行反射,只有反射方向有能量,其他方向能量为0

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

折射

光从一种介质进入另一种介质,一部分反射一部分进入。反射、折射能量大小根据菲尼尔定律决定。

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

粗糙镜面反射

法线偏移较小,反射集中在一个区域。磨砂质感。

粗糙镜面折射

毛玻璃效果 游戏引擎常用其他物体渲染结果传入折射shader,采样修改透明度实现。

多层材质

透过上层材质看到下层材质

次表面散射

光线在半透明物体内多次反射造成。玉石、皮肤...
SSS贴图实现

改变材质表面

顶点携带的法线数量有限,使用法线贴图补充漫反射。
光照计算有法线参与,对法线进行调整能够影响光照计算结果。

模型数据在渲染中的作用

纹理动画

  1. 利用法线贴图改变光反射、折射方向
  2. 在片段着色器修改uv值,使得纹理采样偏移实现贴图运动效果

顶点动画

顶点着色器中修改顶点位置实现动画
需要顶点数量够多效果才好

顶点色

控制颜色范围(不同顶点间的颜色插值)

顶点法线与面法线

顶点法线

每个位置的法线由不同顶点法线插值得到,比较平滑。

面法线

一个面上每个位置的法线位置相同(面上每个顶点共用同一个法线,插值结果相同)

模型存储格式(obj格式)

未使用平滑组 未使用平滑组。每个面一个顶点法线信息,一个面3个顶点共用 使用平滑组 使用平滑组。每个顶点都有一个法线信息,用s 1表示使用平滑组

扩展

NPR渲染把(模型背面)顶点往法线方向偏移,直接在片段着色器中给定颜色实现描边效果。
没做法线平滑时会出现描边断裂情况。

作业

顶点色还可以做什么

  1. 作为遮罩,对模型不同部分进行区别处理。
  2. 着色。顶点数量少的时候效果差

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

平面上每一个位置的法线将会是平面上每个顶点法线信息插值得来,相邻平面的法线方向连续平滑。