2012-01-21 3 views
4

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

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

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(); 

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

ответ

5

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

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); 
+0

Это сработало! Синий был удален из других объектов (к сожалению, кажется, что круг не рисуется), но это касается исходного вопроса. Благодаря! – Silvae

+2

извините, но «отвяжите текстуру»? Это первый раз, когда я слышу такую ​​бессмыслицу –

+1

, здесь неотвязывание не обязательно. просто используйте 'glDisable (GL_TEXTURE_2D)' – Rookie

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(); 

glDisable(GL_TEXTURE_2D); 
+0

Я добавил «Включить/отключить», но, похоже, проблема не устранена. – Silvae

+0

@Silvae В этом случае проблема швов будет в другом месте (а не в коде, который вы отправили). Как вы создаете текстуры? –

+0

Я отправлю код о том, как я загружаю текстуры, если мне нужно (я делаю это через SDL). У меня есть одно быстрое заявление, прежде чем я это сделаю.Если я удалю метод рисования синего круга (или даже просто удаления glColor4f) из моего кода, у меня нет проблем с синими текстурами. Я чувствую, что это поведение не означает, что текстуры загружаются неправильно, но я могу ошибаться. – Silvae

7

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

+0

Спасибо за ответ! Это сработало. Я бы дал вам галочку, кроме Роберта, выложенную до вас. Я все равно дал вам +1! – Silvae

1

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

Если у вас нет подсветки, восстановить исходный цвет текстуры просто - просто установите glColor в белый цвет: glColor4f (1.0, 1.0, 1.0, 1.0). Проблема возникает, когда на вашей текстуре включено освещение. Затем настройка цвета на белый или изменение режима текстуры на REPLACE не помогает вообще - ваши световые эффекты будут удалены! (что никто, кажется, не замечает!) Причина этого в том, что с включением GL_COLOR_MATERIAL по умолчанию вы получаете поведение, когда команды glColor меняют оба цвета 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

Привет! Я все еще смущен. Итак, вышеуказанный код следует вставить перед функцией draw_object или после? Спасибо! –

Смежные вопросы