странная ошибка openGL? - PullRequest
       3

странная ошибка openGL?

1 голос
/ 15 апреля 2011

У меня есть следующий код:

glNormal3f(0, 0, 1);
glColor3f(1, 0, 0);
glBegin(GL_POINTS);
    glVertex3f(-45, 75, -5);
    glVertex3f(-45, 90, -5);
    glVertex3f(-30, 90, -5);
    glVertex3f(-30, 80, -5);
    glVertex3f(-35, 80, -5);
    glVertex3f(-35, 75, -5);
    glVertex3f(-45, 75, -5);

glEnd();
glColor3f(1, 1, 0);
glBegin(GL_POLYGON);
    glVertex3f(-45, 75, -5);
    glVertex3f(-45, 90, -5);
    glVertex3f(-30, 90, -5);
    glVertex3f(-30, 80, -5);
    glVertex3f(-35, 80, -5);
    glVertex3f(-35, 75, -5);
    glVertex3f(-45, 75, -5);

glEnd();

Обратите внимание, что код между glBegin и glEnd в каждом экземпляре идентичен.

Но вершины GL_POLYGON (желтый) несовпадать с GL_POINTS (красный).Вот скриншот:

openGL bug

Чем больше я использую openGL, тем больше я его ненавижу.Но, наверное, я что-то не так делаю ... Что случилось?

Ответы [ 3 ]

5 голосов
/ 15 апреля 2011

Это потому, что ваш многоугольник не выпуклый - верхний правый угол вогнутый.GL_POLYGON работает только для выпуклых многоугольников.

Попробуйте использовать GL_TRIANGLE_FAN вместо этого и начните с нижнего левого угла: ваш многоугольник имеет звездообразную форму, поэтому вы можете нарисовать его одним GL_TRIANGLE_FAN, если вы начинаете с точки в его ядре (изваши вершины, нижняя левая - единственная, которая удовлетворяет этому условию).

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

3 голосов
/ 15 апреля 2011

В спецификации указано для GL_POLYGON:

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

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

Кстати: я до сих пор не использовал GL_POLYGON.Но я думаю, что вам не нужно указывать последнюю вершину (которая равна первой).Насколько я знаю, он будет подключен автоматически.

1 голос
/ 16 апреля 2011

GLU Tesselator - это удобный способ автоматически конвертировать вогнутые (и другие сложные) полигоны в подходящие для opengl. Проверьте это:

http://glprogramming.com/red/chapter11.html

http://www.songho.ca/opengl/gl_tessellation.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...