当前位置:网站首页>Unity3d learning notes 5 - create sub mesh
Unity3d learning notes 5 - create sub mesh
2022-07-07 23:21:00 【charlee44】
List of articles
1. summary
In the article Unity3D Learning notes 4—— establish Mesh Advanced interface Through advanced API The way to create a Mesh, It also mentioned a SubMesh The concept of .Mesh It is the encapsulation concept of three-dimensional objects , An easy requirement is , I want to use materials in some places A, I want to use materials in some places B, I don't want to put this Mesh To break up , So it's very simple , That's it Mesh Divided into two sub Mesh That's all right. .
2. Detailed discussion
2.1. Realization
We create the following script , And casually attach two different materials in the attribute material1 And attribute material2 On :
using UnityEngine;
using UnityEngine.Rendering;
[ExecuteInEditMode]
public class Note5Main : MonoBehaviour
{
public Material material1;
public Material material2;
// Start is called before the first frame update
void Start()
{
Mesh mesh = CreateMesh();
MeshFilter mf = gameObject.GetComponent<MeshFilter>();
if (mf == null)
{
mf = gameObject.AddComponent<MeshFilter>();
}
mf.sharedMesh = mesh;
MeshRenderer meshRenderer = gameObject.GetComponent<MeshRenderer>();
if (meshRenderer == null)
{
meshRenderer = gameObject.AddComponent<MeshRenderer>();
}
Material[] materials = new Material[2];
materials[0] = material1;
materials[1] = material2;
meshRenderer.materials = materials;
}
Mesh CreateMesh()
{
Mesh mesh = new Mesh();
const int vertexCount = 8;
Vector3[] vertices = new Vector3[vertexCount]
{
new Vector3(-5, 0, 0),
new Vector3(-5, 5, 0),
new Vector3(5, 0, 0),
new Vector3(5, 5, 0),
new Vector3(-5, -5, 0),
new Vector3(-5, 0, 0),
new Vector3(5, -5, 0),
new Vector3(5, 0, 0),
};
Vector3[] normals = new Vector3[vertexCount]
{
new Vector3(0, 0, -1),
new Vector3(0, 0, -1),
new Vector3(0, 0, -1),
new Vector3(0, 0, -1),
new Vector3(0, 0, -1),
new Vector3(0, 0, -1),
new Vector3(0, 0, -1),
new Vector3(0, 0, -1),
};
Vector2[] uv = new Vector2[vertexCount]
{
new Vector2(0, 0),
new Vector2(0, 1),
new Vector2(1, 0),
new Vector2(1, 1),
new Vector2(0, 0),
new Vector2(0, 1),
new Vector2(1, 0),
new Vector2(1, 1),
};
mesh.vertices = vertices;
mesh.normals = normals;
mesh.uv = uv;
int[] triangles = new int[12] {
0, 1, 2, 1, 3, 2, 4, 5, 6, 5, 7, 6 };
MeshUpdateFlags flags = MeshUpdateFlags.DontValidateIndices | MeshUpdateFlags.DontResetBoneBounds
| MeshUpdateFlags.DontNotifyMeshUsers | MeshUpdateFlags.DontRecalculateBounds;
//MeshUpdateFlags flags = MeshUpdateFlags.Default;
int indexCount = triangles.Length;
mesh.SetIndexBufferParams(indexCount, IndexFormat.UInt32);
mesh.SetIndexBufferData(triangles, 0, 0, indexCount, flags);
mesh.subMeshCount = 2;
SubMeshDescriptor subMeshDescriptor1 = new SubMeshDescriptor(0, 6);
mesh.SetSubMesh(0, subMeshDescriptor1, flags);
SubMeshDescriptor subMeshDescriptor2 = new SubMeshDescriptor(6, 6);
mesh.SetSubMesh(1, subMeshDescriptor2, flags);
return mesh;
}
// Update is called once per frame
void Update()
{
}
}
The effect I get here is as follows :
2.2. analysis
Obviously , I created two quadrangles here , And put it in a Mesh Next . I use a simple interface to create vertex attributes , Creating vertex index attribute information uses a high-level interface . The key point is to SubMesh Description of :
mesh.subMeshCount = 2;
SubMeshDescriptor subMeshDescriptor1 = new SubMeshDescriptor(0, 6);
mesh.SetSubMesh(0, subMeshDescriptor1, flags);
SubMeshDescriptor subMeshDescriptor2 = new SubMeshDescriptor(6, 6);
mesh.SetSubMesh(1, subMeshDescriptor2, flags);
SubMeshDescriptor Class defines which vertex index to start with , How long is the space after that SubMesh, That is to say Mesh Made a division . in addition ,GameObject The number of materials attached to the should also correspond :
MeshRenderer meshRenderer = gameObject.GetComponent<MeshRenderer>();
if (meshRenderer == null)
{
meshRenderer = gameObject.AddComponent<MeshRenderer>();
}
Material[] materials = new Material[2];
materials[0] = material1;
materials[1] = material2;
meshRenderer.materials = materials;
MeshRenderer It can be connected with multiple materials , How many SubMesh How many materials should there be , They are one-to-one . The quantity is not corresponding Unity The editor will report an error .
By dividing SubMesh To describe a Mesh It is usually used when there are multiple materials , If you use the same material , You'd better not do SubMesh Divide . We turn on Frame Debug, You can see :
One Mesh It is divided into two rendering instructions ! The reason is that image engine is usually a state machine , A material needs to correspond to a rendering instruction , This is why we tend to reuse materials as much as possible , Reduce the number of different materials .
3. Reference resources
边栏推荐
- Two kinds of curves in embedded audio development
- Matlab-SEIR传染病模型预测
- Bit operation
- Oracle-数据库的备份与恢复
- 微信论坛交流小程序系统毕业设计毕设(1)开发概要
- ROS2专题(03):ROS1和ROS2的区别【02】
- Cloud native is devouring everything. How should developers deal with it?
- Mysql索引优化实战二
- Wechat forum exchange applet system graduation design completion (7) Interim inspection report
- ArcGIS: two methods of attribute fusion of the same field of vector elements
猜你喜欢
Matlab-SEIR传染病模型预测
Specific method example of V20 frequency converter manual automatic switching (local remote switching)
Unity3D学习笔记5——创建子Mesh
PMP project management exam pass Formula-1
Gee (IV): calculate the correlation between two variables (images) and draw a scatter diagram
微信论坛交流小程序系统毕业设计毕设(2)小程序功能
三问TDM
UE4_UE5蓝图command节点的使用(开启关闭屏幕响应-log-发布全屏显示)
Cloud native is devouring everything. How should developers deal with it?
Ros2 topic (03): the difference between ros1 and ros2 [01]
随机推荐
微信论坛交流小程序系统毕业设计毕设(5)任务书
Network security - Eternal Blue
JS get the key and value of the object
Network security sqlmap and DVWA explosion
Dynamics 365 find field filtering
Network security - phishing
leetcode-520. 检测大写字母-js
Explain
PMP project management exam pass Formula-1
ArcGIS:字段赋值_属性表字段计算器(Field Calculator)依据条件为字段赋值
When copying something from the USB flash disk, an error volume error is reported. Please run CHKDSK
海内外技术人们“看”音视频技术的未来
Install a new version of idea. Double click it to open it
Network security - information query of operating system
Wechat forum exchange applet system graduation design completion (4) opening report
树后台数据存储(採用webmethod)[通俗易懂]
Specific method example of V20 frequency converter manual automatic switching (local remote switching)
USB (十七)2022-04-15
Quelles sont les similitudes et les différences entre les communautés intelligentes et les villes intelligentes?
14、 Two methods of database export and import