2017-08-24 265 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

相关问题