GLSL тесселяция шейдеров число треугольников / граней?
Я реализовал треугольный тесселяционный шейдер, как показано в примере на этом сайте.
Как я могу определить общее количество лиц, которые будут выводиться для определенных inter
а также outer
факторы тесселяции? - Это никак не влияет на мою программу, я просто хотел бы узнать, сколько у меня чисел.
3 ответа
Количество треугольников для барицентрического подразделения одного треугольника (где внутреннее и внешнее подразделение равны) можно найти с помощью простой рекурсии:
// Calculate number of triangles produced by barycentric subdivision (i.e. tessellation)
// Where n is the level of detail lod and outer and inner level is always equal
int calculateTriangles(int n) {
if(n < 0) return 1; // Stopping condition
if(n == 0) return 0;
return ((2*n -2) *3) + calculateTriangles(n-2); // Recurse
}
Мне нужен был аналогичный ответ: количество созданных вершин с учетом тесселяции, а также внутренний и внешний уровни детализации (где все LOD могут отличаться). Я решил это, и это было не так уж далеко, чтобы выяснить количество лиц.
Так что вот ответы на оба, для тесселяции треугольника. Мой синтаксис для LOD - IL для внутреннего LOD и OL0, OL1 и OL2 для внешнего LOD для трех ребер. Я почти уверен, что они правы, но если кто-нибудь сможет сгенерировать несколько нечетных случаев, посчитать результаты и перепроверить, это было бы здорово.
Inner faces/triangles (based only on IL):
if IL==1 -> inner faces = 0
if IL odd -> inner faces = 3/2*(IL-1)(IL-3)+1
if IL even -> inner faces = 6*(IL/2-1)^2
Outer faces/triangles
if IL==1 -> outer faces = (OL0+OL1+OL2 == 3) ? 1 : OL0+OL1+OL2
else -> outer faces = 3*IL+OL0+Ol1+OL2-6
Total = Inner + Outer faces
Я знаю - это довольно безумно выглядящие уравнения. Одной вещью, которая действительно помогла, было понимание того, что сумма любого монотонно увеличивающегося ряда, такого как (7+9+11+13+15+17), может быть вычислена как (num_elements/2*(first_element+last_element). Вот где заканчиваются квадраты доходит от.
И если кого-то волнует количество вершин:
Inner vertices:
if IL==1 -> inner vertices = (OL0+OL1+OL2 == 3) ? 0 : 1
if IL odd -> inner vertices = (IL-1)^2 * 3/4
if IL even -> inner vertices = 3((IL/2)^2-IL/2) +1
Outer vertices = OL0+OL1+OL2
Total = Inner + Outer vertices (OL0+OL1+OL2)
Вот ответ для квадратов для числа вершин и граней треугольника.
Quad Vertices (LOD levels are IL0, IL1, OL0, OL1, OL2, OL3)
Inner vertices:
if IL0==IL1==1 but OL0+OL1+OL2+OL3>4 -> inner vertices = 1
else -> inner vertices = (IL0-1)*(IL1-1)
Outer vertices = OL0+OL1+OL2+OL3
Total = Inner + Outer vertices
Quad Faces (triangles)
Outer ring faces =
if IL0==IL1==OL0=OL1=OL2=OL3==1 -> 1 face total
if IL0==IL1==1 but OL0+OL1+OL2+OL3>4 -> calc as if IL0=IL1=2
else OL0+OL1+OL2+OL3+2*IL0+2*IL1-8
Inner faces:
if IL0<3 and IL1<3 -> 0
else 2*(IL0-2)*(IL1-2)
Total = Inner + Outer
i.e.: when IL0/IL1>2 -> OL0+OL1+OL2+OL3+2*IL0+2*IL1-8 + 2*(IL0-2)*(IL1-2)
Сравнительно изолинии действительно просты:
Isoline (LOD levels are OL0, OL1 - OL0 is missing top edge)
num vertices = OL0*(OL1+1)
num segments = OL0*OL1
Вот так вот несколько длинных уравнений!
Надеюсь, что это полезно!
Что ж, когда я имел дело с внутренним и внешним тесселяцией, это помогло мне понять, как считать их. Очень разумное и простое объяснение.:)