2017-08-24 165 views
10

我想從網格紅色,藍色和綠色中設置三角形的每個三個頂點。爲三角形中的每個頂點設置顏色

正如在第一部分this教程這是另一種語言。這是他們使用的設置紅色,綠色和藍色,從網格的每個三角形的每個vertext代碼:

function set_wireframe_colors(m) 
    local cc = {} 
    for i = 1, m.size/3 do 
     table.insert(cc, color(255,0,0)) 
     table.insert(cc, color(0,255,0)) 
     table.insert(cc, color(0,0,255)) 
    end 
    m.colors = cc 
end 

,這是輸出看起來像一個簡單的頂點顏色着色器:

enter image description here


我試圖重新在Unity-同樣的事情用C#,但我本教程的第一部分中掙扎。

這裏是我的代碼:

void Start() 
{ 
    Mesh mesh = GetComponent<MeshFilter>().mesh; 
    Vector3[] vertices = mesh.vertices; 

    //Create new colors array where the colors will be created. 
    Color32[] colors = new Color32[vertices.Length]; 

    for (int i = 0; i < vertices.Length; i += 3) 
    { 
     colors[i] = new Color32(255, 0, 0, 255); 
     colors[i + 1] = new Color32(0, 255, 0, 255); 
     colors[i + 2] = new Color32(0, 0, 255, 255); 
    } 

    //assign the array of colors to the Mesh. 
    mesh.colors32 = colors; 
} 

但這是輸出我從Unity得到一個簡單的頂點顏色着色器:

enter image description here


如果你仔細看就會看到我的多維數據集中的每個頂點都沒有像第一次截圖中的多維數據集那樣分配給它的rgb顏色。它看起來非常接近。

有什麼不好的代碼?爲什麼每個頂點都不像我的第一張截圖中的圖像那樣具有RGB顏色。

着色

這個問題可能已經無關着色器,但這裏簡單的顏色着色器在Unity:

struct appdata 
{ 
    float4 vertex : POSITION; 
    float2 uv : TEXCOORD0; 
    float4 color : COLOR; 
}; 

struct v2f 
{ 
    float2 uv : TEXCOORD0; 
    UNITY_FOG_COORDS(1) 
    float4 vertex : SV_POSITION; 
    float4 color : COLOR; 
}; 

sampler2D _MainTex; 
float4 _MainTex_ST; 


v2f vert(appdata v) 
{ 
    v2f o; 
    o.vertex = UnityObjectToClipPos(v.vertex); 
    o.color = v.color; 

    o.uv = TRANSFORM_TEX(v.uv, _MainTex); 
    UNITY_TRANSFER_FOG(o,o.vertex); 
    return o; 
} 

float4 frag(v2f i) : SV_Target 
{ 
    return i.color; 
} 
+0

檢查這一個... ...將是有益的:https://forum.unity3d.com/threads/standard-shader-with-vertex-colors.316529/ – joreldraw

+0

正當紅說。這篇文章正在討論如何製作頂點着色器。這個問題是關於如何設置網格中每個三角形中每個頂點的顏色,從代碼而不是着色器。這是不同的,我認爲這個問題可能來自C#代碼。也許頂點不正確。 – Programmer

+0

您不指定着色器或代碼...只有頂點顏色 – joreldraw

回答

10

他使用網格對每一個3個獨立的頂點三角形(每四個頂點6個)。在一個統一立方體中,每個面是一個有4個頂點的四邊形,每個面上的2個三角形共享2個頂點。
enter image description here

在左邊是具有4個頂點和mesh.triangles陣列將是0 1 2 1 0 3四,而右邊是具有6個頂點與mesh.triangles = 0 1 2 3 4 5(頂點順序事項背面剔除一個四邊形。以我着色器我有Cull設置爲關閉)。

因此,您可以在該着色器的圖像中看到,只要您小心並確保每個三角形在每個頂點中都有一種顏色,就可以使用由四個頂點四邊形組成的網格。


正如我在評論中所說,你可以拆分你的網格,以便你有三個獨特的頂點爲每個三角形。

void Start() { 
    Mesh mesh = GetComponent<MeshFilter>().mesh;   
    SplitMesh(mesh); 
    SetColors(mesh); 
} 

void SplitMesh(Mesh mesh) 
{ 
    int[] triangles = mesh.triangles; 
    Vector3[] verts = mesh.vertices; 
    Vector3[] normals = mesh.normals; 
    Vector2[] uvs = mesh.uv; 

    Vector3[] newVerts; 
    Vector3[] newNormals; 
    Vector2[] newUvs; 

    int n = triangles.Length; 
    newVerts = new Vector3[n]; 
    newNormals = new Vector3[n]; 
    newUvs  = new Vector2[n]; 

    for(int i = 0; i < n; i++) 
    { 
     newVerts[i] = verts[triangles[i]]; 
     newNormals[i] = normals[triangles[i]]; 
     if (uvs.Length > 0) 
     { 
      newUvs[i] = uvs[triangles[i]]; 
     } 
     triangles[i] = i; 
    }   
    mesh.vertices = newVerts; 
    mesh.normals = newNormals; 
    mesh.uv = newUvs;   
    mesh.triangles = triangles;    
} 
void SetColors(Mesh mesh) 
{ 
    Color[] colors = new Color[mesh.vertexCount]; 
    for (int i = 0; i < colors.Length; i+=3) 
    { 
     colors[i] = Color.red; 
     colors[i + 1] = Color.green; 
     colors[i + 2] = Color.blue; 
    } 
    mesh.colors = colors; 
} 

enter image description here

+0

哇,一切都變得更有意義。我只是在Maya中製作了一個簡單的立方體並將其導入Unity。我認爲很難排序頂點的順序。如果你有一個解決方案可以做到這一點,那就沒問題。 – Programmer

+0

@Programmer這是幹什麼用的?你可以使用幾何着色器嗎?如果沒有,你可以將你的網格統一或者像Maya或者Blender這樣的3D程序分割爲veretx/edge。否則,您正在查看[圖形着色問題](https://en.wikipedia.org/wiki/Graph_coloring) – Pluto

+0

不能,我不能使用幾何着色器來使它在不同的設備上兼容。這是爲了在線框中顯示對象。看到[this](https://codea.io/talk/discussion/3170/render-a-mesh-as-wireframe)文章瞭解這一點。我只是不能得到這個第一部分正常工作..... – Programmer

相關問題