могут ли вершины совпадать в выпуклых многоугольниках? - PullRequest
1 голос
/ 07 ноября 2010

Я новичок в openGL и читаю Красную книгу.Теперь в качестве упражнения я хочу нарисовать сферу вручную.Для этого я делю сферу на кусочки и стопки, и таким образом получаю несколько прямоугольников, но около полюсов сферы я получаю треугольники.(надеюсь, это было ясно, что я делаю).Теперь я знаю, что если вы рисуете многоугольник с GL_POLYGON, и он пересекает себя, поведение не определено.Мой вопрос таков: учитывая три точки v1, v2, v3, которые не находятся на одной строке, это неопределенное поведение, чтобы сделать это:

glBegin(GL_POLYGON)
vertex v1
vertex v1
vertex v2
vertex v3
glEnd();

Это может быть объединение двух не связанных вопросов в один, но яинтересно также это: если я решу разделить прямоугольники в моей сфере действия на треугольники, имеет ли значение, как я это делаю, то есть по какой диагонали я делю прямоугольник на два треугольника?Я предполагаю, что для рисования одноцветной сферы это не будет иметь значения, но я не знаю о текстурах, шейдерах, освещении и т. Д.

Ответы [ 2 ]

4 голосов
/ 07 ноября 2010

Когда я занимался openGL, я быстро использовал только треугольники. Они особенные в том, что треугольник ни в коем случае не является двусмысленным.

Вы пример, хотя, я думаю, это будет работать, хотя, вероятно, с артефактами.

то, как вы разбиваете прямоугольник, не имеет значения, лишь бы вы обращали внимание на то, как намотаны ваши треугольники, как вы определяете точки, поскольку именно это диктует их спереди и сзади.

Но определенно придерживайтесь треугольников, изображайте эти четыре точки квадрата

(0,0,0) (1,0,0) (1,0,1) (0,0,1)

Довольно легко увидеть, что это плоский квадрат, но что если я поменяю их на

(0,1,0) (1,0,0) (1,1,1) (0,0,1)

что у тебя сейчас? это может быть нарисовано как долина или как холм. если я определил эту форму с помощью треугольников, вы точно знаете, что я описываю

(0,1,0) (1,0,0) (1,1,1) (1,1,1) (1,0,1) (0,1,0)

Гороподобная форма

хорошо ... так что я немного отследил здесь ... моя точка зрения в том, что я не знаю, что ваш код будет делать на практике, но я не думаю, что вы должны использовать его в любом случае. и то, как вы разделяете прямоугольники, не должно иметь значения, если ваши треугольники описаны правильно.

2 голосов
/ 07 ноября 2010

Это не проблема вообще. OpenGL всегда должен иметь возможность справиться с возможностью растеризации геометрии, когда несколько вершин попадают в одно и то же место, поскольку даже разные входные точки могут оказаться одной и той же выходной точкой в ​​зависимости от вида модели и матриц проекции (или вашей геометрии и / или вершины шейдер, если вы находитесь на программируемом конвейере). Он предназначен для математически правильной работы в самых разных случаях.

Основной тест OpenGL для того, чтобы нарисовать пиксель с геометрией, находится ли его центр в пределах математических границ рисуемого примитива *. Таким образом, OpenGL может визуализировать полигоны, которые рисуют непостоянные наборы пикселей (что обычно происходит, когда они становятся почти исчезающими) или которые вообще не рисуют пиксели (что обычно бывает, когда они оказываются действительно маленькими, но технически они могут быть произвольно большими размер, пока они сжаты между центрами пикселей).

Точные тесты, используемые на аппаратном уровне, могут варьироваться от поставщика к поставщику и гарантированно будут правильными только для выпуклой геометрии на экране - вот почему большинство людей говорят, что придерживаются треугольников, поскольку они неизбежно выпуклые.

(*) отдельный экран-ориентированный тест, применяемый к пикселям точно на границе, чтобы гарантировать, что они приписываются только одному полигону, где многоугольники встречаются вдоль общего края

...