glColor фактически не меняет цвет OpenGL - PullRequest
3 голосов
/ 29 ноября 2011

У меня особенно неприятная проблема. В определенных ситуациях вызовы glColor, по-видимому, игнорируются, в результате чего объекты отображаются с неправильным цветом.

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

Когда вы запускаете программу, все, что вы видите на экране, это два коробчатых объекта, если смотреть под углом. Объект слева отображается путем вызова glCallList(boxModel1);, а объект справа отображается путем вызова glCallList(boxModel2);. Два списка отображения создаются явно названными методами.

Для boxModel1 и boxModel2 я использую один список отображения, называемый squareModel, для рендеринга сторон боксов. Я делаю это потому, что хотя квадратная модель в этом случае тривиальна, squareModel в моей реальной программе гораздо сложнее, с измененными нормалями и т. Д.

Проблема связана с методом createManyRectangles. Когда он вызывается с достаточно маленьким числом (2715 для меня), цвета появляются нормально: синий ящик и красный ящик. Когда число большое (2716 для меня), цвета игнорируются, и оба поля отображаются белым.

Может кто-нибудь пролить свет на то, что здесь происходит?

Ответы [ 3 ]

3 голосов
/ 29 ноября 2011

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

Списки отображения не автономны. Они не восстанавливают состояние OpenGL после того, как они его изменили. Если DL изменяет состояние OpenGL, то это будет состояние OpenGL после выполнения DL.

Вы просто не опубликовали достаточно кода, чтобы окончательно сказать что-нибудь ; это только наиболее вероятное объяснение. Пока вы не сможете опубликовать репродуцируемое дело, реального способа помочь нет.

1 голос
/ 18 августа 2012

У меня была похожая проблема, когда я рисовал множество точек с разными цветами, а затем синий каркасный куб. (Я использовал GLUT для своего проекта.)

Изначально мой код выглядел так:

glBegin(GL_POINTS);

    for(int i=0;i<N;i++)
     {
      glColor3f(R[i],G[i],B[i]);
      glVertex3f(X[i],Y[i],Z[i]);
     }

glEnd();
glColor3f(0.0f, 0.0f, 1.0f);
glutWireCube(2.0f);

Однако это привело к мерцающему кубу, который непрерывно изменял свой цвет от кадра к кадру до некоторых непредсказуемых цветов, как будто последний glColor3f просто игнорируется.

Решение: я поставил glColor3f для куба перед glEnd ().

glBegin(GL_POINTS);

    for(int i=0;i<N;i++)
     {
      glColor3f(R[i],G[i],B[i]);
      glVertex3f(X[i],Y[i],Z[i]);
     }

glColor3f(0.0f, 0.0f, 1.0f);    // <= Changed only the position of this line
glEnd();
glutWireCube(2.0f);

Я не знаю, ПОЧЕМУ, но это решило мою проблему. Теперь я получаю синий каркасный куб, и glColor3f больше не игнорируется ...

ура

David

0 голосов
/ 03 декабря 2011

Попробуйте запустить вашу программу с glIntercept . Это позволяет вам записывать каждый сделанный вызов OpenGL. Сравните результат, полученный между 2715 и 2716 количеством прямоугольников. Если есть какие-либо различия, это должно привести вас в правильном направлении.

редактировать

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

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

Кроме того, если списки отображения оказываются проблемой, вам действительно нужно использовать списки отображения? Некоторое время они все меньше и меньше использовались в пользу VBO. Возможно, вы сможете решить эту проблему с помощью списка отображения.

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