<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      Unity3D學習筆記5——創建子Mesh

      1. 概述

      在文章Unity3D學習筆記4——創建Mesh高級接口通過高級API的方式創建了一個Mesh,里面還提到了一個SubMesh的概念。Mesh是對于三維物體對象的封裝概念,一個很容易的需求是,有的地方我希望用到材質A,有的地方我希望用到材質B,我不想把這個Mesh進行拆分,那么很簡單,就在這個Mesh中劃分兩個子Mesh就可以了。

      2. 詳論

      2.1. 實現

      我們創建如下腳本,并且隨便掛接兩個不同的材質在屬性material1和屬性material2上:

      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()
          {
              
          }
      }
      
      

      我這里得到的效果如下:

      imglink1

      2.2. 解析

      很明顯,我這里創建了兩個四邊形,并且將其放到一個Mesh下。創建頂點屬性我使用的是簡單接口,創建頂點索引屬性信息使用的是高級接口。關鍵點在于對SubMesh的描述:

      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類定義了從那個頂點索引開始,之后多長的空間是一個SubMesh,也就是對Mesh做了一個劃分。另外,GameObject上掛接的材質個數也要對應:

      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上能掛接多個材質,有多少個SubMesh就應該有多少個材質,它們是一一對應的。數量沒對應上Unity編輯器會報錯。

      通過劃分SubMesh的方式來描述一個Mesh通常是用于存在多個材質的情況,如果使用的都是同一個材質,就最好不要作SubMesh劃分。我們打開Frame Debug,可以看到:
      imglink2

      一個Mesh分成了居然兩個渲染指令來實現!原因在于圖像引擎通常是一個狀態機,一個材質需要對應一個渲染指令,這就是為什么我們往往要盡可能復用材質,減少不同材質的個數。

      3. 參考

      1. Unity3D學習筆記4——創建Mesh高級接口
      posted @ 2022-07-03 10:40  charlee44  閱讀(637)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 昔阳县| 成人动漫综合网| 欧美乱码伦视频免费| 久久精品女人天堂av| 精品人妻伦一二三区久久| 日韩精品一区二区三区激情| 真实国产乱子伦视频| 97人人添人人澡人人澡人人澡| 亚洲 中文 欧美 日韩 在线 | 国产黄色三级三级看三级| 中文字幕亚洲一区二区三区| 介休市| 精品久久人人妻人人做精品| 国产综合久久亚洲综合| 临沭县| 干老熟女干老穴干老女人| 四虎永久地址WWW成人久久| 定襄县| 欧美偷窥清纯综合图区| 亚洲黄色性视频| 国产成人亚洲无码淙合青草| 国内自拍偷拍一区二区三区 | 狼色精品人妻在线视频| 国产在热线精品视频99公交| 国产午夜美女福利短视频| 国产精自产拍久久久久久蜜| 丰满岳乱妇久久久| 性欧美vr高清极品| 亚洲女初尝黑人巨| 亚洲av色在线播放一区| 中文无码乱人伦中文视频在线| 中文字幕无码不卡在线| 亚洲成人一区| 欧美成人午夜在线观看视频| 宁陕县| 国产成人免费午夜在线观看| 熟女性饥渴一区二区三区| 日韩精品无码区免费专区| 尤物国精品午夜福利视频| 欧美性69式xxxx护士| 99久久婷婷国产综合精品青草漫画 |