Тесселяция патча BSpline с использованием списка треугольников (OpenGL)

Как следует из названия, я пытаюсь создать тесселяцию патча BSpline, используя список треугольников.

Вот изображение моего патча спереди, которое выглядит именно так, как должно.

передний патч

Моя проблема в задней части патча, который дает этот эффект:

патч сзади

Как вы можете видеть, предыдущий ряд треугольников соединяется с новым строящимся рядом. Я пробовал различные способы избежать этого, такие как увеличение значения индекса на 1, когда оно достигает конца строки. Единственное быстрое решение, которое я смог найти, — это поместить каждую строку в отдельный цикл (с диапазоном цикла, потому что размер этой строки), что вовсе не интуитивно понятно.

Вот код для рисования моего патча:

void drawBSplinePatch1(std::vector<int>& sample_elements_out, const int samples)
{
for(int i = 0; i <= 379; i++)
{
// first triangle
sample_elements_out.push_back(i);
sample_elements_out.push_back(i + 1);
sample_elements_out.push_back(i + samples);

// second triangle
sample_elements_out.push_back(i  + samples);
sample_elements_out.push_back(i + 1);
sample_elements_out.push_back(i + samples + 1);
}
}

0

Решение

Пропустить квад для каждой строки, например, как это.

for(int i = 0; i <= 379; i++)
{
if (i % ROW_LENGTH != ROW_LENGTH - 1) {
// first triangle
sample_elements_out.push_back(i);
sample_elements_out.push_back(i + 1);
sample_elements_out.push_back(i + samples);

// second triangle
sample_elements_out.push_back(i  + samples);
sample_elements_out.push_back(i + 1);
sample_elements_out.push_back(i + samples + 1);
}
}

Тем не менее, два вложенных цикла, вероятно, будут более читабельными.

0

Другие решения

Других решений пока нет …