Неожиданное поведение геометрического шейдера с использованием ввода смежности линий
Я пытаюсь написать простой шейдер для рисования трехмерной линии с толщиной, чтобы выучить геометрический шейдер в единстве. Однако я сталкиваюсь с проблемой с выводом из шейдера при установке входного значения геометрического шейдера в топологию 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 кажутся мусором).
Я пытался отлаживать это целый день, но без прогресса, поэтому мне нужна помощь здесь! заранее спасибо