Неожиданное поведение геометрического шейдера с использованием ввода смежности линий

Я пытаюсь написать простой шейдер для рисования трехмерной линии с толщиной, чтобы выучить геометрический шейдер в единстве. Однако я сталкиваюсь с проблемой с выводом из шейдера при установке входного значения геометрического шейдера в топологию lineadj, что, как я подозреваю, как-то связано со "странным" значением третьей и четвертой вершин, принимаемых геометрическим шейдером.

Вот как я генерирую свою сетку из сценария aC#:

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 кажутся мусором).

Я пытался отлаживать это целый день, но без прогресса, поэтому мне нужна помощь здесь! заранее спасибо

0 ответов

Другие вопросы по тегам