C# 为三角形中的每个顶点设置颜色
我想将三角形的三个顶点分别设置为红色、蓝色和绿色网格 如第一部分教程所示,这是另一种语言的教程。这是他们用于从网格中为每个三角形中的每个顶点文本设置红色、绿色和蓝色的代码:C# 为三角形中的每个顶点设置颜色,c#,unity3d,vertex-shader,vertex,C#,Unity3d,Vertex Shader,Vertex,我想将三角形的三个顶点分别设置为红色、蓝色和绿色网格 如第一部分教程所示,这是另一种语言的教程。这是他们用于从网格中为每个三角形中的每个顶点文本设置红色、绿色和蓝色的代码: 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))
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
这是一个简单的顶点颜色着色器的输出:
我试着用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;
}
他使用的网格每个三角形有3个单独的顶点(每个四边形6个顶点)。在unity立方体中,每个面是一个具有4个顶点的四边形,每个面上的2个三角形共享2个顶点。
左侧是一个具有4个顶点和
网格的四边形。三角形数组将是0 1 2 1 0 3
,右侧是一个具有6个顶点和网格的四边形。三角形=0 1 2 3 4 5
(顶点顺序对背面消隐非常重要。在我的着色器中,消隐设置为关闭)
因此,正如您在该着色器的图像中所看到的,您可以使用由4个顶点四边形组成的网格,只要您小心并确保每个三角形的每个顶点中都有一种颜色
正如我在评论中所说,您可以分割网格,以便每个三角形有3个唯一的顶点
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;
}
void Start(){
网格网格=GetComponent().Mesh;
SplitMesh(mesh);
设置颜色(网格);
}
空心分割网格(网格)
{
int[]三角形=网格三角形;
Vector3[]顶点=网格顶点;
Vector3[]法线=mesh.normals;
Vector2[]uv=mesh.uv;
向量3[]新向量;
向量3[]新法线;
矢量2[]新UV;
int n=三角形。长度;
newVerts=新矢量3[n];
新法线=新向量3[n];
newUvs=新向量2[n];
对于(int i=0;i0)
{
newUvs[i]=uvs[三角形[i]];
}
三角形[i]=i;
}
mesh.vertexs=新顶点;
mesh.normals=新法线;
mesh.uv=新uv;
mesh.triangles=三角形;
}
无效设置颜色(网格)
{
颜色[]颜色=新颜色[mesh.vertexCount];
对于(int i=0;i
检查一下这个。。。会很有帮助的:只要红色就行了。这篇文章是关于制作顶点着色器的,我可以做到。这个问题是关于如何从代码而不是着色器中设置网格中每个三角形中每个顶点的颜色。这是不同的,我认为问题可能来自C代码。可能顶点没有按顺序排列。您没有指定着色器或代码…只有顶点颜色您的立方体为每个顶点指定了rgb颜色。但标准的统一立方体有24个顶点。在同一个地方,每个角落都有3个不同的角落。@Woltus,如果你认为这可能是问题所在的话。我还在绞尽脑汁想如何解决这个问题。哇,一切都变得更有意义了。我只是在Maya中创建了一个简单的立方体,并将其导入Unity。我认为很难对顶点的顺序进行排序。如果你有一个解决方案可以做到这一点,那就好了。@Programmer这是干什么的?可以使用几何体着色器吗?如果没有,则可以在unity中或在3d程序(如Maya)中分割网格,或使用veretx/edge split的Blender分割网格。否则,您将看到一个Nope,我无法使用几何体着色器使其在不同设备上兼容。这用于在线框中显示对象。请参阅本文,以便更好地理解这一点。我只是不能让这第一部分正常工作…你能分割你的网格吗?如果是从3D程序,那么不。我只希望这是100%代码+着色器解决方案,就像链接的帖子建议的那样。
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;
}