使用线邻接输入的几何着色器的意外行为

时间:2015-07-31 03:47:04

标签: graphics unity3d shader hlsl geometry-shader

我正在尝试编写一个简单的着色器来绘制具有厚度的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,我想要绘制我的线条。然而,这是我得到的输出

enter image description here

此输入数据顶点位置为(-20,0,0)和(0,-20,0),由中心2个方块标记。左上角和右下角是c#函数生成的相邻顶点的位置。正如您所看到的那条线似乎连接到位置(0,0,0)并且线条快速闪烁,这让我怀疑GS中的顶点是否已损坏?线的起点为红色,线的末端为绿色。

如果我编辑GS输出pos0和pos1而不是pos1和pos2,我得到这个

enter image description here

没有闪烁的线条。

如果我绘制pos2和pos3,结果会更疯狂(pos2和pos 3似乎是垃圾值)。

我一直试图调试这一整天但没有进展,所以我需要一些帮助!提前致谢

0 个答案:

没有答案