Unity基础原理 - 3D模型渲染
时间:2024-09-12 来源:朝夕友人 点击:
本文原理来源于:
1,Unity渲染模型都是从顶点(vertices)开始,顶点是由一组三维向量数组(Vector3[])构成,各个顶点的三维坐标分布在空间中。
2,顶点赋值完毕后,开始生成三角面(triangles),三角面是一组整形数组(int[]),其元素是顶点的三维向量数组的索引值,每三个元素构成一个三角面。
图片来源:https://catlikecoding.com/unity/tutorials/procedural-grid/
每构成一个三角面的三个顶点中,渲染面的方向按照顶点的顺时针旋转方向构成的面进行渲染。由此易得,三角面这个数组的大小永远是3的倍数。
以下步骤应该可以不分先后:
3,网格模型生成完毕后,重置Unity默认法线(normal)值,默认法线值为(0, 0, 1)。法线是垂直于三角面的,若有多个三角面共用一点,那么这个点就有多少根法线,但是如果同一个点法线方向不同,就会产生如下图所示的软硬边线的情况。
图片来源:https://blog.csdn.net/cbbbc/article/details/70023642
4,网格模型生成完毕后,增加纹理贴图(uv)坐标,uv是由一组二维向量(Vector2[])组成,代表着平面贴图的坐标。纹理贴图坐标是添加在顶点上的。这样就把一个立体模型的所有面展开成了一个平面。
图片来源:https://blog.csdn.net/BonChoix/article/details/8619624
5,为了让模型的细节更丰富,需要增加一个法线贴图(normal map),法线贴图通过像素的RGB值存储法线的向量值,但是这个法线贴图所存储的向量值是存在于一个切线空间中的所以需要先生成切线空间(tangents),切线空间是一组四维向量(Vector4[]),其中最后一个分量用于对称的纹理贴图,其值只有1和-1两种情况。
切线空间的生成方法见:
由于光照信息是存在于世界空间的,而法线贴图存储的向量是存在于切线空间的,所以需要通过切线空间进行转换。