当前位置:网站首页>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
边栏推荐
- Wechat forum exchange applet system graduation design completion (7) Interim inspection report
- CXF call reports an error. Could not find conduct initiator for address:
- Bit operation
- 经纬度PLT文件格式说明
- Specific method example of V20 frequency converter manual automatic switching (local remote switching)
- Advantages and disadvantages of rest ful API
- Network security - phishing
- PMP project management exam pass Formula-1
- ROS2专题(03):ROS1和ROS2的区别【01】
- Cloud native is devouring everything. How should developers deal with it?
猜你喜欢
Talk about the design and implementation logic of payment process
MATLAB signal processing [Q & A essays · 2]
13、 System optimization
成年人只有一份主业是要付出代价的,被人事劝退后,我哭了一整晚
PCI-Express接口的PCB布线规则
高级程序员必知必会,一文详解MySQL主从同步原理,推荐收藏
【编译原理】词法分析设计实现
UE4_UE5全景相机
JMeter interface automated test read case, execute and write back result
给出一个数组,如 [7864, 284, 347, 7732, 8498],现在需要将数组中的数字拼接起来,返回「最大的可能拼出的数字」
随机推荐
Adults have only one main job, but they have to pay a price. I was persuaded to step back by personnel, and I cried all night
UE4_UE5结合罗技手柄(F710)使用记录
What are the similarities and differences between smart communities and smart cities
LeeCode -- 6. Zigzag transformation
LDO穩壓芯片-內部框圖及選型參數
PHP uses Alibaba cloud storage
Dynamics 365 find field filtering
Wechat forum exchange applet system graduation design (2) applet function
In the field of software engineering, we have been doing scientific research for ten years!
统计电影票房排名前10的电影并存入还有一个文件
USB (十七)2022-04-15
Two kinds of curves in embedded audio development
LDO voltage stabilizing chip - internal block diagram and selection parameters
USB(十五)2022-04-14
Archlinux install MySQL
网络安全-钓鱼
Specific method example of V20 frequency converter manual automatic switching (local remote switching)
Bit operation
Network security - phishing
When copying something from the USB flash disk, an error volume error is reported. Please run CHKDSK