培训类网站开发,谁可以帮我做网站,西安最新招聘信息今天,seodg官网文章目录0、写在前面的话1、什么是 Mesh1.1 Mesh 组成1.1.1 顶点#xff08;Vertices#xff09;1.1.2 三角形#xff08;Triangles#xff09;1.1.3 法线#xff08;Normals#xff09;1.1.4 UV#xff08;纹理坐标#xff09;1.2 与Mesh相关组件2、一个最小 Mesh 示例…文章目录0、写在前面的话1、什么是 Mesh1.1 Mesh 组成1.1.1 顶点Vertices1.1.2 三角形Triangles1.1.3 法线Normals1.1.4 UV纹理坐标1.2 与Mesh相关组件2、一个最小 Mesh 示例创建一个三角形2.1 给三角形Mesh添加纹理2.2 给三角形添加法线贴图2.2.1 法线Normals2.2.2 切线Tangents3、建造四边形4、MeshFilter5、材质Material属性0、写在前面的话我创建的Unity、C#交流群有兴趣可加入大家一起学习人还很少现在加入就是元老群里面聊天不限于技术话题9529142231、什么是 MeshUnity Mesh 是 Unity 中用于表示三维模型的核心组件通常被称为网格。它是由顶点、边和三角形组成的几何结构用于定义 3D 模型的形状和外观。Mesh 是 3D 图形学的基础所有的 3D 模型都可以看作是由多个三角形拼接而成的网格。1.1 Mesh 组成顶点Vertices三角形索引Triangles / Indices法线NormalsUV纹理坐标切线Tangents顶点颜色Colors子网格SubMesh1.1.1 顶点VerticesVector3[]verticesmesh.vertices;每个 Vector3 表示一个顶点在 模型空间Local Space 下的位置顶点数量决定了 Mesh 的几何精度1.1.2 三角形Trianglesint[]trianglesmesh.triangles;每 3 个 int 构成一个三角形数值表示 顶点索引顺序遵循 顺时针 / 逆时针影响法线朝向顺时针正面可见逆时针反面可见1.1.3 法线NormalsVector3[]normalsmesh.normals;用于光照计算如果不手动设置需调用 RecalculateNormals()1.1.4 UV纹理坐标Vector2[]uvsmesh.uv;控制贴图在模型上的映射常见错误顶点数量与 UV 数量不一致1.2 与Mesh相关组件MeshFilter提供 MeshMeshRenderer提供材质并渲染2、一个最小 Mesh 示例创建一个三角形usingUnityEngine;// 确保有必要组件[RequireComponent(typeof(MeshFilter),typeof(MeshRenderer))]publicclassCreateMesh:MonoBehaviour{publicintxSize,ySize;privateVector3[]vertices;privatevoidAwake(){GenerateDot();// 创建meshGenerateMesh();}// 辅助显示可省略privatevoidGenerateDot(){verticesnewVector3[(xSize1)*(ySize1)];verticesnewVector3[(xSize1)*(ySize1)];for(inti0,y0;yySize;y){for(intx0;xxSize;x,i){vertices[i]newVector3(x,y);}}}// 辅助显示可省略privatevoidOnDrawGizmos(){if(verticesnull){return;}Gizmos.colorColor.black;for(inti0;ivertices.Length;i){Gizmos.DrawSphere(vertices[i],0.1f);}}privatevoidGenerateMesh(){varmeshnewMesh{nameProcedural Mesh};// 顶点mesh.verticesnewVector3[]{newVector3(0,0,0),newVector3(1,0,0),newVector3(0,1,0)};// 三角形mesh.trianglesnewint[]{0,2,1};// 注意 0 1 2 为逆时针不可见// mesh.triangles new int[] { 0, 2, 1, 0, 1, 2 }; // 双面可见// 重算法线、包围盒mesh.RecalculateNormals();mesh.RecalculateBounds();GetComponentMeshFilter().meshmesh;}}2.1 给三角形Mesh添加纹理可以通过应用纹理为网格添加表面细节。最简单的纹理是用于为表面着色的图像。在 URP 中这被称为底图。下图展示了这样一个纹理可以很容易地看出纹理是如何应用到三角形上的。由于纹理是二维图像三角形表面也是二维的因此纹理坐标是Vector2数值。它们指定了在每个顶点处对纹理进行采样的位置并将在整个三角形表面上进行插值。这些坐标是归一化的因此 0 到 1 的范围覆盖了每个维度上的整个纹理。在 Unity 中纹理的原点位于左下角因此最直接且无失真的纹理映射方式是将顶点位置与纹理坐标对齐。我们通过将数组赋值给网格的uv属性来添加纹理坐标。纹理坐标通常被称为 UV 坐标因为它们是纹理空间中的二维坐标分别命名为 U 和 V 而不是 X 和 Y。privatevoidGenerateMesh(){varmeshnewMesh{nameProcedural Mesh};// 顶点mesh.verticesnewVector3[]{newVector3(0,0,0),newVector3(1,0,0),newVector3(0,1,0)};// 三角形mesh.trianglesnewint[]{0,2,1,};// 纹理uv坐标mesh.uvnewVector2[]{Vector2.zero,Vector2.right,Vector2.up};// 重算法线、包围盒mesh.RecalculateNormals();mesh.RecalculateBounds();GetComponentMeshFilter().meshmesh;}你也可以用不同的方式映射纹理例如使用Vector2.one第三个顶点。这将扭曲图像使其发生剪切变形。您还可以通过将Color数组赋值给color网格的属性或Color32将数组赋值给其colors32属性来为每个顶点定义颜色。这些颜色将像纹理坐标一样进行插值。默认的 URP 着色器不支持顶点颜色但您可以创建一个使用顶点颜色的着色器图。本文将不包含顶点颜色部分。2.2 给三角形添加法线贴图另一种常见的添加表面细节的方法是法线贴图。这通常通过法线贴图纹理来实现该纹理是一张包含表面法线矢量的图像。这里展示了一个这样的纹理它描绘了一个由凸起和凹陷交替组成的醒目的棋盘格图案并添加了一些细微的不平整以增加变化。导入图像后设置其Texture Type到Normal map否则 Unity 将无法正确解析。然后将其用作材质球的Normal Map属性2.2.1 法线Normals法线向量是如何作用的法线是一个垂直于表面的矢量。我们总是使用单位长度的法线并用它们指向表面的外部从而区分表面的内外法线是怎么计算的Mesh.RecalculateNormals 计算每个顶点的法线是通过计算哪些三角形与该顶点相连先确定这些平面三角形的法线对它们进行平均最后对结果进行归一化处理。没有调用Mesh.RecalculateNormals调用Mesh.RecalculateNormals2.2.2 切线Tangents虽然目前看来这种方法似乎有效但结果并不正确。原本看起来较高的部分应该看起来较低反之亦然。这是因为法线贴图的向量存在于纹理空间中需要转换到世界空间才能影响光照。这需要一个变换矩阵它定义了一个相对于表面的三维空间称为切线空间。切线空间由右轴、上轴和前轴组成。向上轴应指向远离曲面的方向这由顶点法向量确定。此外我们还需要向右轴和向前轴。向右轴应指向我们认为正确的方向在本例中即为向右Vector3.right。它也被称为切线轴或切线向量因为它必须始终与曲面曲率相切。我们通过将向量赋值给tangents网格的属性来定义每个顶点的这些轴。着色器可以通过计算垂直于法线和切线的向量来构建第三个轴。然而它可以通过两种不同的方式生成指向前方或后方的向量。这就是为什么切线向量必须是Vector4值它们的第四分量应为 1 或 -1以控制第三个轴的方向。默认的切向量指向右侧其第四分量设置为 1。由于 Unity 的着色器构建切空间的方式这是不正确的我们必须改用 −1Unity为左手坐标系mesh.normalsnewVector3[]{Vector3.back,Vector3.back,Vector3.back};mesh.tangentsnewVector4[]{newVector4(1f,0f,0f,-1f),newVector4(1f,0f,0f,-1f),newVector4(1f,0f,0f,-1f)};左边为正确的法线贴图显示右边为错误的法线贴图显示正确与错误相对于原法线贴图而言3、建造四边形privatevoidGenerateMesh(){varmeshnewMesh{nameProcedural Mesh};// 顶点mesh.verticesnewVector3[]{newVector3(0,0,0),newVector3(1,0,0),newVector3(0,1,0),newVector3(1,1,0)};// 三角形mesh.trianglesnewint[]{0,2,1,1,2,3};// 纹理uv坐标mesh.uvnewVector2[]{Vector2.zero,Vector2.right,Vector2.up,Vector2.one};// 切线mesh.tangentsnewVector4[]{newVector4(1f,0f,0f,-1f),newVector4(1f,0f,0f,-1f),newVector4(1f,0f,0f,-1f),newVector4(1f,0f,0f,-1f)};// 重算法线、包围盒mesh.RecalculateNormals();mesh.RecalculateBounds();GetComponentMeshFilter().meshmesh;}4、MeshFilter上文提到了在Unity中我们要制作并显示一个Mesh需要用到MeshFilter和MeshRenderer或者其他的Renderer。而MeshFilter则是核心毕竟后者只负责显示它的源码实在是太短了被封装地很好以至于我们能用的只有mesh和sharedmesh两个属性。 至于二者的区别就像字面含义一样mesh会返回当前MeshFilter使用的Mesh对象的副本sharedmesh会直接返回Mesh对象本身。也就是如果我们通过后者对Mesh进行操作那么所有使用了这个Mesh对象的物体都会受到影响。维度meshsharedMesh是否实例化✅ 会自动实例化一份 Mesh❌ 不会实例化是否影响其他对象❌ 仅影响当前对象✅ 所有引用该 Mesh 的对象运行时安全性✅ 安全⚠️ 高风险容易误改全局内存占用较高每次访问可能产生副本较低共享同一份数据典型使用场景运行时动态修改网格静态模型 / 编辑器批量修改5、材质Material属性1渲染模式Rendering Mode属性说明Opaque不透明Cutout镂空Fade渐变透明Transparent透明功能决定了材质如何处理透明度和混合效果。25.2 反射率Albedo属性设置纹理贴图和颜色。功能反照率贴图控制物体表面反射光线的颜色是材质外观的基础。35.3 金属度Metallic属性当前值为 0表示该材质不是金属材质。取值范围是 0 到 10 代表非金属1 代表完全金属。功能用于模拟材质的金属特性控制材质对光线的反射方式。4光滑度Smoothness属性当前值为 0.5取值范围是 0 到 1值越高表示材质表面越光滑。功能影响材质的镜面反射效果光滑的表面会产生更清晰的反射。5法线贴图Normal Map属性目前未启用。法线贴图是一张包含表面法线信息的纹理。功能在不增加模型多边形数量的情况下模拟出表面的凹凸细节。使用方法从资源库中找到合适的法线贴图拖入该属性框中。例如为一个平面添加岩石的法线贴图就能让它看起来有岩石的凹凸质感。6高度贴图Height Map属性未启用。高度贴图记录了材质表面的高度信息。功能可以配合置换 shader 来实现更真实的几何形状变化比如地形的高低起伏。使用方法导入高度贴图后需要在支持置换的 shader 中使用以实现更复杂的几何效果。7遮挡贴图Occlusion属性未启用。遮挡贴图记录了表面上哪些区域更容易被遮挡。功能用于增强材质的阴影效果使场景看起来更真实。使用方法将遮挡贴图应用到材质上它会根据模型的几何形状来调整光照模拟出环境光遮挡的效果。8细节遮罩Detail Mask属性未启用。功能用于混合多个细节纹理控制不同纹理在材质表面的显示区域。使用方法结合多个细节纹理和遮罩贴图可创建出更丰富的材质细节如在墙面材质上添加污渍、划痕等细节。9发射Emission属性当前颜色为黑色即不发光。功能使材质能够自发光常用于制作灯光、火焰等效果。使用方法点击颜色框选择发光颜色或者拖入发光纹理贴图调整强度滑块来控制发光的亮度。10平铺Tiling属性X 和 Y 轴均为 1决定了纹理在模型表面重复的次数。功能用于调整纹理在模型上的覆盖密度。使用方法如果想让纹理更密集可增大 X 和 Y 的值若希望纹理稀疏一些则减小数值。11偏移Offset属性X 和 Y 轴均为 0控制纹理在模型表面的位置。功能可以移动纹理在模型上的显示位置。使用方法通过调整 X 和 Y 的值可以将纹理在模型表面进行平移以达到合适的视觉效果。12细节反照率Detail Albedo x2属性未启用。功能用于添加额外的细节纹理与主反照率纹理混合增强材质细节。使用方法导入细节纹理后调整混合参数使其与主纹理自然融合比如在地面材质上添加一些细小的石子纹理。13次要法线贴图Normal Map属性未启用。功能提供额外的法线信息进一步增强表面的凹凸细节。使用方法与主法线贴图类似导入合适的法线贴图与主法线效果叠加创造出更丰富的表面细节。14镜面高光Specular Highlights属性已勾选启用镜面高光效果。功能控制材质表面的高光显示使物体看起来更有光泽。使用方法若不需要高光效果取消勾选即可。15反射Reflections属性已勾选启用反射效果。功能让材质能够反射周围环境增加真实感。使用方法可通过调整反射探头等设置来优化反射的效果和质量。16渲染队列Render Queue属性当前设置为 “From Shader”值为 2000。功能决定了物体的渲染顺序数值越小越先渲染。使用方法在处理透明物体、粒子效果等需要特定渲染顺序的情况时可手动调整渲染队列值。17启用 GPU 实例化Enable GPU Instancing属性未勾选。功能在场景中有大量相同物体时可提高渲染性能。使用方法当场景中有许多重复的模型如森林中的树木勾选该选项可减少渲染开销。