Я рендеринга полигона в OpenGL с массивом вершин, который называется vertices
, и индексным буфером final
под названием DRAW_ORDER
с обмоткой CCW. У меня включена функция отбрасывания назад, и я делаю обратные вызовы с использованием glDrawElements(GL_TRIANGLES, DRAW_ORDER.capacity(), GL_UNSIGNED_SHORT, DRAW_ORDER)
.Как восстановить порядок намотки CCW после отражения вершин по оси x или y?
Когда я отражаю vertices
по оси x или y через матричное преобразование, полигон отбирается, потому что отражение меняет ориентацию вершин, так что они больше не соответствуют порядку намотки CCW DRAW_ORDER
.
Я могу предотвратить проблему, отключив отбраковывание, но для повышения эффективности я предпочел бы найти способ восстановить ориентацию vertices
через перестановку. Например, если многоугольник был треугольником, я мог бы просто поменять вторую и третью вершины после отражения, чтобы восстановить ориентацию CCW. Как я могу распространить этот подход на многоугольник с произвольным числом вершин и индексов?
//PSEUDO-CODE FOR TRIANGLE:
final DRAW_ORDER = {0,1,2};
vertices = { {0,0}, {1,0}, {0,1} };
reflect(vertices);
swap(vertices,1,2);
EDIT: Вот решение, которое, кажется, работает для выпуклых многоугольников, но не вогнутая.
//Reverse the order of the vertices so, for example,
//vertices {v1,v2,v3,v4,v5} become {v5,v4,v3,v2,v1}
for(int start = 0, end = vertices.length-1; start<end; start++, end--){
swap(vertices,start,end);
}
Вы можете видеть на изображении ниже, как решение работает для эллипса (который является выпуклым), но не звезда (которая является вогнутой).
Непосредственно отвечая на ваш вопрос, но вы рассматривали использование 'glFrontFace (GL_CW)', чтобы указать, что ваши лицевые грани имеют порядок намотки CW? –
Да, но тогда мне нужно будет отслеживать, какой порядок намотки у каждого полигона есть, и каждый раз, когда изменяется обмотка, происходит вызов gl. К тому моменту, когда я это делаю, я полагаю, что я мог бы полностью отключить отбраковку. – William
Это не соответствует описанию проблемы в вашем вопросе. В этом вопросе вы говорите, что порядок намотки изменяется, потому что вы применяете отражение в преобразовании. Теперь вы говорите, что у каждого полигона может быть другой порядок намотки? –