我想从网格红色,蓝色和绿色设置三角形的每个三个顶点。
如第一部分this教程中所见,该教程适用于另一种语言。这是他们用来为网格中每个三角形中的每个椎骨设置红色,绿色和蓝色的代码:
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#在Unity中重新创建相同的东西,但我正在努力学习本教程的第一部分。
这是我的代码:
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获得的输出,带有一个简单的顶点颜色着色器:
如果你仔细观察,你会看到我的立方体中的每个顶点没有像我的第一个截图中的立方体一样分配给它的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 :(得分:10)
他使用的网格每个三角形有3个独立的顶点(每个四边形有6个顶点)。在一个统一立方体中,每个面都是一个带有4个顶点的四边形,每个面上的2个三角形共享2个顶点。
左边是一个四边形,有4个顶点,mesh.triangles
数组是0 1 2 1 0 3
,右边是一个四边形,有6个顶点,mesh.triangles
= {{1} (顶点顺序对于背面剔除很重要。在我的着色器中,我将Cull设置为关闭)。
因此,您可以在图像中看到此着色器,您可以使用由4个顶点四边形组成的网格,只要您小心并确保每个三角形在每个顶点中都有一种颜色。
正如我在评论中所说,您可以拆分网格,以便每个三角形有3个唯一的顶点。
0 1 2 3 4 5