Unity渲染基礎——Mesh原理

       這片文章其實是綜合了我之前看過的幾篇文章,然後彙總了一下。參看文章貼在文末。涉獵到相關的內容是之前學習換裝的時候,作者將skinmeshrenderer中的mesh數據顯示到了ui上,從而實現了在UI上顯示模型的需求。

       Unity中想要顯示一個3D模式,必須要知道該模式的形狀,這個形狀其實就是mesh數據。有了mesh數據後,再通過Mesh Filter組件將mesh數據發送給Mesh Renderer組件進行渲染。Mesh Filter組件不一定每個gameObject對象都有,但是Mesh Rnderer組件是一定有的。那麼我們就可以自定義mesh的數據,然後掛上一個Mesh Renderer組件從而渲染出我們想要的效果。

      Mesh:是指模型的網格,建模就是建網格。細看Mesh,可以知道Mesh的主要屬性內容包括頂點座標法線紋理座標三角形繪製序列等其他有用屬性和功能。因此建網格,就是畫三角形;畫三角形就是定位三個點。

     下面是一個cube的mesh,可以看到,每個面有兩個三角形。6個面一個12個三角形。每個面是4個頂點座標,6個面一共24個

XX

頂點座標 。注意,這裏的頂點座標和我們通常理解的正方體頂點(8個)是不一樣的。可能的原因是,每個面的渲染都需要單獨記錄4個頂點,然後就24的頂點了。。。

        自定義渲染一個mesh,只需要制定頂點數據,由頂點構成的三角形序列,最後還要指定uv數據。  

public void InitMesh()
{
    // 指定頂點數據
    _mesh.vertices = new Vector3[4]{
        new Vector3(-1, -1, 0),
        new Vector3(1, -1, 0),
        new Vector3(-1, 1, 0),
        new Vector3(1, 1, 0),
    };

    // 通過頂點爲網格創建三角形。頂點必須要順時針存放!!!!!
    int[] triangles = new int[6]{0, 3,1,   0, 2, 3};
    _mesh.triangles = triangles;

    // 指定uv座標
    _mesh.uv = new Vector2[4]{
        new Vector2(0.5f, 0),
        new Vector2(1, 0),
        new Vector2(0.5f, 0.5f),
        new Vector2(1, 0.5f),
    };
}

這裏指定了4個在同一個平面的頂點數據。然後從任意一個頂點開始,順時針指定兩個三角形序列。最後指定uv座標數據。如下圖所示:

如下圖:

兩個三角形,按照順時針方向,排好頂點即可。

uv數據是指的將貼圖座標投影到模型的mesh表面。它定義了貼圖上每個點的位置的信息.,這些點與3D模型是相互聯繫的, 以決定表面紋理貼圖的位置。UV就是將圖像上每一個點精確對應到模型物體的表面.,在點與點之間的間隙位置由軟件進行圖像光滑插值處理, 這就是所謂的UV貼圖.。      

下面看下在android平臺下Opengl紋理系統座標,左下角爲原點。

我們現在討論怎樣使用這些紋理座標。當我們指定頂點數組中的頂點時,我們需要在另一個數組中提供紋理座標,它稱爲紋理座標數組。這裏需要注意定義座標數組順序,這很關鍵。

如果,uv順序的指定,相對於貼圖來說,是一個倒“Z”的順序。 我的實驗代碼中,就是取的貼圖的右下角一部分。

最後,將mesh對象指定給MeshFilter組件即可顯示該自定義的mesh了。

參考文章:

1、《uv紋理座標設定與貼圖規則

2、《Unity裏的Mesh屬性

3、《Unity之使用Mesh創建一個Cube

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章