OpenGL - невозможно отобразить цвета кроме белого после наложения текстуры - PullRequest
1 голос
/ 04 мая 2009

Я пытаюсь визуализировать цветной куб после рендеринга других кубов, имеющих текстуры. У меня есть несколько объектов "Drawer", которые соответствуют интерфейсу Drawer, и я передаю каждую ссылку на объект GL в метод draw (final GL gl) каждого отдельного реализующего класса. Тем не менее, независимо от того, что я делаю, я не могу сделать цветной куб.

Пример кода:

gl.glDisable(GL.GL_TEXTURE_2D);

gl.glColor3f( 1f, 0f, 0f );
gl.glBegin(GL.GL_QUADS);
// Front Face
Point3f point = player.getPosition();

gl.glNormal3f(0.0f, 0.0f, 1.0f);
//gl.glTexCoord2f(0.0f, 0.0f);

gl.glVertex3f(-point.x - 1.0f, -1.0f, -point.z + 1.0f);
//gl.glTexCoord2f(1.0f, 0.0f);

gl.glVertex3f(-point.x + 1.0f, -1.0f, -point.z + 1.0f);
//continue rendering rest of cube. ...
gl.glEnd();
gl.glEnable(GL.GL_TEXTURE_2D);

Я также пытался бросать вызовы glColor3f перед каждым вызовом вершины, но это все равно дает мне белый куб. Что случилось?

Ответы [ 4 ]

3 голосов
/ 05 мая 2009

Если освещение включено, цвет исходит от материала, а не от цветов вершин glColor. Если ваша функция рисования, которую вы упомянули, устанавливает материал для текстурированных объектов (и белый материал под текстурой будет обычным), тогда остальные кубы будут белыми. Использование GL_COLOR_MATERIAL устанавливает OpenGL для приема команд glColor и обновления материала, а не только цвета вершины, чтобы это работало.

Итак, проще говоря, если у вас включено освещение, попробуйте GL_COLOR_MATERIAL.

3 голосов
/ 05 мая 2009

Есть несколько вещей, которые вы должны убедиться.

Сначала:

gl.glEnable(gl.GL_COLOR_MATERIAL);

Это позволит вам применять цвета к вашим вершинам. (Сделайте это до звонков в glColor3f.)

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

Для большинства приложений вы, вероятно, захотите использовать

gl.glEnable(gl.GL_BLEND);
gl.glBlendFunc(gl.GL_SRC_ALPHA,gl.GL_ONE_MINUS_SRC_ALPHA);

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

0 голосов
/ 04 мая 2009

Что нужно проверить:

  • Есть ли активный шейдер?
  • Есть ли gl-ошибки?
  • Какие другие штаты вы изменили? Например, GL_COLOR_MATERIAL, смешивание или освещение изменят внешний вид вашей геометрии.
  • Работает ли это, если сначала вы рисуете нетекстурированный куб? И если он попытается выяснить, в какой момент он становится белым. Также возможно, что куб будет отображаться только в правильном цвете в первом кадре, тогда определенно присутствует состояние GL.
  • Помещение glPushAttrib / glPopAttrib в начале / конце ваших методов рисования может помочь, но лучше сначала выяснить, что вызвало проблему.
0 голосов
/ 04 мая 2009

Одна вещь, которую вы можете попробовать: glBindTexture(GL_TEXTURE_2D, 0);, чтобы связать текстуру с нулем.

...