我正在尝试编写一个简单的着色器来绘制具有厚度的3D线,以便在统一中学习几何着色器。但是,当将几何着色器的输入设置为lineadj拓扑时,我面临着着色器输出的问题,我怀疑它与几何着色器所采用的第三和第四个顶点的“奇怪”值有关。 / p>
这就是我从c#脚本生成网格的方法:
public static GameObject DrawShaderLine( Vector3[] posCont, float thickness, Material mat)
{
GameObject line = CreateObject ("Line", mat);
line.GetComponent<Renderer>().material.SetFloat("_Thickness", thickness);
int posContLen = posCont.Length;
int newVerticeLen = posContLen + 2;
Vector3[] newVertices = new Vector3[newVerticeLen];
newVertices[0] = posCont[0] + (posCont[0]-posCont[1]);
for(int i =0; i < posContLen; ++i)
{
newVertices[i+1] = posCont[i];
}
newVertices[newVerticeLen-1] = posCont[posContLen-1] + ( posCont[posContLen-1] - posCont[posContLen-2]);
List<int> newIndices = new List<int>();
for(int i = 1; i< newVerticeLen-2; ++i)
{
newIndices.Add(i-1);
newIndices.Add(i);
newIndices.Add(i+1);
newIndices.Add(i+2);
}
Mesh mesh = (line.GetComponent (typeof(MeshFilter)) as MeshFilter).mesh;
mesh.Clear ();
mesh.vertices = newVertices;
//mesh.triangles = newTriangles;
mesh.SetIndices(newIndices.ToArray(), MeshTopology.LineStripe, 0);
return line;
}
这是在着色器程序中运行的GS
v2g vert(appdata_base v)
{
v2g OUT;
OUT.pos = v.vertex;
return OUT;
}
[maxvertexcount(2)]
void geom(lineadj v2g p[4], inout LineStream<g2f> triStream)
{
float4x4 vp = mul(UNITY_MATRIX_MVP, _World2Object);
g2f OUT;
float4 pos0 = mul(vp, p[0].pos);
float4 pos1 = mul(vp, p[1].pos);
float4 pos2 = mul(vp, p[2].pos);
float4 pos3 = mul(vp, p[3].pos);
OUT.pos = pos1;
OUT.c = half4(1,0,0,1);
triStream.Append(OUT);
OUT.pos = pos2;
OUT.c = half4(0,1,0,1);
triStream.Append(OUT);
triStream.RestartStrip();
}
根据我的理解,lineadj将接受4个顶点,顶点为[0],顶点[3]为相邻顶点。因此,通过绘制顶点1和顶点2,我想要绘制我的线条。然而,这是我得到的输出
此输入数据顶点位置为(-20,0,0)和(0,-20,0),由中心2个方块标记。左上角和右下角是c#函数生成的相邻顶点的位置。正如您所看到的那条线似乎连接到位置(0,0,0)并且线条快速闪烁,这让我怀疑GS中的顶点是否已损坏?线的起点为红色,线的末端为绿色。
如果我编辑GS输出pos0和pos1而不是pos1和pos2,我得到这个
没有闪烁的线条。
如果我绘制pos2和pos3,结果会更疯狂(pos2和pos 3似乎是垃圾值)。
我一直试图调试这一整天但没有进展,所以我需要一些帮助!提前致谢