glColor раскраска всех текстур - PullRequest
6 голосов
/ 22 января 2012

Я довольно новичок в OpenGL, поэтому, возможно, ответ будет очевидным. В настоящее время я пытаюсь сделать синий круг, используя GL_TRIANGLE_FAN в C ++. Моя проблема в том, что когда я устанавливаю цвет с помощью glColor4f, он устанавливает для всех моих других текстур синий цвет, как показано ниже (это должен быть серебристый металл).

Я рисую текстуры, используя метод, показанный ниже.

glLoadIdentity();
glTranslatef(x,y,0);

glBindTexture(GL_TEXTURE_2D, this->texture); 

glBegin(GL_QUADS);
    glTexCoord2f(0.0f, 0.0f); glVertex3f(0,0,0);
    glTexCoord2f(1.0f, 0.0f); glVertex3f(width,0,0);
    glTexCoord2f(1.0f, 1.0f); glVertex3f(width,height,0);
    glTexCoord2f(0.0f, 1.0f); glVertex3f(0,height,0);   
glEnd();

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

Ответы [ 4 ]

7 голосов
/ 22 января 2012

Отсоедините текстуру и установите цвет на белый после того, как вы закончите рисовать:

glLoadIdentity();
glTranslatef(x,y,0);

glEnable( GL_TEXTURE_2D );
glBindTexture(GL_TEXTURE_2D, this->texture); 

glBegin(GL_QUADS);
    glTexCoord2f(0.0f, 0.0f); glVertex3f(0,0,0);
    glTexCoord2f(1.0f, 0.0f); glVertex3f(width,0,0);
    glTexCoord2f(1.0f, 1.0f); glVertex3f(width,height,0);
    glTexCoord2f(0.0f, 1.0f); glVertex3f(0,height,0);   
glEnd();

glColor4f(1, 1, 1, 1);
glBindTexture(GL_TEXTURE_2D, 0);

И если вы не визуализируете текстуры на следующем объекте, отключите текстурирование:

glDisable( GL_TEXTURE_2D );
7 голосов
/ 22 января 2012

После того, как вы нарисовали свой синий круг, вы должны установить цвет обратно на белый (значение по умолчанию), используя glColor4f(1.f, 1.f, 1.f, 1.f);. Обратите внимание, что по умолчанию текстура модулируется текущим установленным цветом (в вашем случае синим), и именно поэтому ваш серебряный материал приобретает голубоватый оттенок (окончательный цвет = синий цвет * цвет текстуры).

1 голос
/ 23 октября 2014

Когда вы включили glEnable (GL_COLOR_MATERIAL) и изменили цвет с помощью glColor, тогда все ваши текстуры будут затронуты этим цветом.Это связано с тем, что по умолчанию текстура отображается в режиме модуляции (glColor умножается на цвета текстуры).

Если у вас не включено освещение, восстановить исходный цвет текстуры просто - просто установите glColor на белый:glColor4f (1,0, 1,0, 1,0, 1,0).Проблема возникает, когда у вас включено освещение на вашей текстуре.Затем, установка цвета на белый или изменение режима текстуры на REPLACE совсем не поможет - ваши световые эффекты будут удалены!(что, кажется, никто не замечает!) Причина этого заключается в том, что, включив GL_COLOR_MATERIAL по умолчанию, вы получаете поведение, при котором команды glColor изменяют цвета Ambient и Diffuse одновременно - таким образом, будут затронуты ваши свойства ambient и diffuse(потерял).Поэтому все, что вам нужно сделать, чтобы восстановить материальное состояние (и, следовательно, световые эффекты), которое вы имели до применения glEnable (GL_COLOR_MATERIAL), это следующее:

glDisable(GL_COLOR_MATERIAL); //disable color influence
GLfloat ambient[] = { 0.2f, 0.2f, 0.2f, 1.0f }; //default material has this ambient color!
GLfloat diffuse[] = { 0.8f ,0.8f ,0.8f, 1.0f }; //default material has this diffuse color!
glMaterialfv(GL_FRONT, GL_AMBIENT, ambient); //restore default material ambient color
glMaterialfv(GL_FRONT, GL_AMBIENT, diffuse); //restore default material diffuse color

Обратите внимание, что по умолчанию является окружающими диффузные цвета для материала по умолчанию!Там нет чистого белого!

Таким образом, все текстуры, которые вы используете с этой точки, будут нарисованы так, как задумано (с правильным цветом и световыми эффектами).Мне потребовалось некоторое время, чтобы найти этот материал, поэтому я думаю, что это приятно упомянуть здесь.

0 голосов
/ 22 января 2012

Перед тем, как связать текстуру, вам нужно ее включить.И, как правило, вы должны отключить его, когда вы закончите с ним.Как то так:

glEnable( GL_TEXTURE_2D );
glBindTexture(GL_TEXTURE_2D, this->texture); 

glBegin(GL_QUADS);
    glTexCoord2f(0.0f, 0.0f); glVertex3f(0,0,0);
    glTexCoord2f(1.0f, 0.0f); glVertex3f(width,0,0);
    glTexCoord2f(1.0f, 1.0f); glVertex3f(width,height,0);
    glTexCoord2f(0.0f, 1.0f); glVertex3f(0,height,0);   
glEnd();

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