在线网页视频抓取工具,搜索优化是什么意思,济南百度网站开发,电子商务主要干什么最近在做项目优化#xff0c;注意到动态创建Mesh时#xff0c;Unity提供了一套高级方法用于快速创建模型#xff0c;特此记录学习一下。
前言
关于Mesh的基本概念再次不在阐述#xff0c;可以参考Unity Mesh 官方文档#xff0c;介绍的很详细#xff0c;其中
基础方法…最近在做项目优化注意到动态创建Mesh时Unity提供了一套高级方法用于快速创建模型特此记录学习一下。
前言
关于Mesh的基本概念再次不在阐述可以参考Unity Mesh 官方文档介绍的很详细其中
基础方法包括SetVertices、SetNormals、SetUVs、SetTriangles、SetIndices、SetColors、SetTangents、SetBoneWeights 高级方法包括SetVertexBufferParams、SetVertexBufferData、SetIndexBufferParams、SetIndexBufferData、SetSubMesh。
优势
使用基础方法有个限制就是Mesh的最大顶点数量不能超过65535而高级方法则没有这个限制。高级方法跳过了一些检查创建速度更快尤其模型顶点数量较多的情况下有性能提升实测时间缩短将近1/3。
示例
基础方法
需要提前准备好模型的数据
属性名含义类型vertices顶点坐标Verctor3[]normals法线Verctor3[]triangles顶点索引int[]uv纹理坐标Verctor2[]
//创建Mesh并赋值相当于调用SetVertices、SetNormals、SetTriangles、SetUVsMesh mesh new Mesh();mesh.vertices myMeshes[i].vertices;mesh.normals myMeshes[i].normals;mesh.triangles myMeshes[i].triangles;mesh.uv myMeshes[i].uv;//将Mesh赋值给MeshFilter组件GameObject gameObject new GameObject();MeshFilter mf gameObject.AddComponentMeshFilter();mf.sharedMesh mesh;//给模型赋予材质MeshRenderer mr gameObject.AddComponentMeshRenderer();mr.material material;
高级方法推荐
同上先准备好模型的基础数据
////顶点属性描述中添加该模型具有哪些属性该例中有顶点、法线、一个uv其中//顶点坐标 Position 用 3 个 Float32 数据表示//法线向量 Normal 用 3 个 Float32 数据表示//纹理坐标 TexCoord0 用 2 个 Float32 数据表示//VertexAttributeDescriptor[] vertexAttributes new[]{new VertexAttributeDescriptor(VertexAttribute.Position, VertexAttributeFormat.Float32, 3),new VertexAttributeDescriptor(VertexAttribute.Normal, VertexAttributeFormat.Float32, 3),new VertexAttributeDescriptor(VertexAttribute.TexCoord0, VertexAttributeFormat.Float32, 2)};//// 根据顶点数量创建缓冲区// // 假设创建一个四方面片则缓冲区数据如下// 顶点 法线 uv// -5, -5, 0, 0, 0, -1, 0, 0, //第 1 个顶点// -5, 5, 0, 0, 0, -1, 0, 1, //第 2 个顶点// 5, -5, 0, 0, 0, -1, 1, 0, //第 3 个顶点// 5, 5, 0, 0, 0, -1, 1, 1 //第 4 个顶点//int vertexCount myMeshes[i].vertices.Length;int bufferLength 3 3 2;int vertexAttributeBufferLength vertexCount * bufferLength;float[] vertexAttributeBuffer new float[vertexAttributeBufferLength];//// 将准备好的模型数据填充到缓冲区//Vector3[] vertices myMeshes[i].vertices;Vector3[] normals myMeshes[i].normals;Vector2[] uv myMeshes[i].uv;for (int j 0; j vertexCount; j){int start j * bufferLength;//此处 0 ... 7 的原由。观察四方面片示例vertexAttributeBuffer[start 0] vertices[j].x;vertexAttributeBuffer[start 1] vertices[j].y;vertexAttributeBuffer[start 2] vertices[j].z;vertexAttributeBuffer[start 3] normals[j].x;vertexAttributeBuffer[start 4] normals[j].y;vertexAttributeBuffer[start 5] normals[j].z;vertexAttributeBuffer[start 6] uv[j].x;vertexAttributeBuffer[start 7] uv[j].y;}//将顶点缓冲区写入MeshMesh mesh new Mesh();mesh.SetVertexBufferParams(vertexCount, vertexAttributes);mesh.SetVertexBufferData(vertexAttributeBuffer, 0, 0, vertexAttributeBufferLength, 0);//将顶点索引写入索引缓冲区int[] triangles myMeshes[i].triangles;int indexCount triangles.Length;mesh.SetIndexBufferParams(indexCount, IndexFormat.UInt32);mesh.SetIndexBufferData(triangles, 0, 0, indexCount);//每个Mesh至少包含一个SubMesh也可将上面的缓冲区分开赋值分别设置到不同的SubMeshmesh.subMeshCount 1;SubMeshDescriptor subMeshDescriptor new SubMeshDescriptor(0, indexCount);mesh.SetSubMesh(0, subMeshDescriptor);//将Mesh赋值给MeshFilter组件GameObject gameObject new GameObject();MeshFilter mf gameObject.AddComponentMeshFilter();mf.sharedMesh mesh;//给模型赋予材质MeshRenderer mr gameObject.AddComponentMeshRenderer();mr.material material;
备注
此处为了展示高级方法的用法因此未直接创建完整缓冲区数据多执行一次数据的组装即vertexAttributeBuffer数组。实际应用时会直接将缓冲区数据准备好而不是分开存储vertices、normals、uv、triangles直接调用SetXXXBufferParams、SetXXXBufferData。
参考其他博主的文章Unity3D学习笔记4——创建Mesh高级接口