2013-05-05 4 views
0

У меня возникают проблемы с текстурами рендеринга с использованием opengl. Сначала я рисую свою текстуру, затем я рисую квадрат. Чтобы установить цвет с моего квадрата, я использую glColor3f(1.0f,0.0f,0.0f);. Это делает квадрат красного. Но затем, когда мои текстуры снова отображаются, они также отображаются с красным цветом.Текстура получает неправильный цвет

В чем проблема?

ответ

4

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

Обычно (в зависимости от среды текстуры) цвет вершин и постоянный цвет объединяются во время вершинного затенения, затем интерполируются и затем умножаются на цвет текселя при затенении фрагментов.

Если вы используете glColor3f(1,0,0), вы получите умножение красного канала текстуры на 1.0, а зеленые и синие каналы на 0,0 - так что вы получите только красный канал текстуры.

Вам необходимо сбросить свой постоянный цвет до 1,1,1, чтобы увидеть обычный цвет текстуры.

Вообще говоря, вам нужно будет установить все ваше общее состояние gl за раз, а затем «вернуться» к этому состоянию после того, как вы нарисуете все, что требует необычных изменений. Это иногда называют «нулевым состоянием». Вы также заметите, что в большой литературе по настройке производительности предлагается группировать вещи, которые имеют похожие необычные ненужные состояния - это может иметь или не иметь эффекта в зависимости от графических драйверов, оборудования и т. Д.

1

«Проблема» в том, что (a) по умолчанию opengl использует режим GL_MODULATE texenv, поэтому цвет фрагмента умножается на цвет текстуры для получения окончательного цвета и (b) что openGL является конечный автомат, поэтому красный цвет остается до тех пор, пока вы установите другой цвет.

Обратите внимание, что при использовании освещения GL_MODULATE очень полезно комбинировать результат расчета освещения с цветами текстуры.

Если вы хотите просто текстуру как есть, вы можете либо указать белый цвет перед нанесением текстурированного объекта, наше использование другого режим enivronment текстуры как GL_REPLACE:

glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); 

Посмотри на manpage of glTexEnv для объяснение этой функции и доступных режимов и опций.

+0

Мне нравится это лучше, чем мой ответ. +1 для вас! – leander

+0

@leander: Хе-хе, я просто поддержал ваш ответ, потому что я чувствовал, что он отвечает на вопрос так же хорошо, как и мой. – derhass

+0

: подсказки шляпы: Спасибо вам любезно =) – leander

0

Если вы хотите только нарисовать текстуру (даже зарисовку), перед рисованием текстуры не нужно белого цвета, если вы хотите только нарисовать текстуру. Вы только указать coordenates перед вершиной функции вытягивания, как в этом примере:

 
void dibujarTexturaIluminacionPlana(GLuint texName){

glShadeModel(GL_FLAT); //Flat model ilumination glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, texName); glBegin(GL_TRIANGLES); for(int i=0; i<caras.size(); i++){ glNormal3f(normales[i].x, normales[i].y, normales[i].z); glTexCoord2f(cTs[caras[i]._0].x, cTs[caras[i]._0].y); glVertex3f(vertices[caras[i]._0].x, vertices[caras[i]._0].y ,vertices[caras[i]._0].z); glTexCoord2f(cTs[caras[i]._1].x, cTs[caras[i]._1].y); glVertex3f(vertices[caras[i]._1].x, vertices[caras[i]._1].y ,vertices[caras[i]._1].z); glTexCoord2f(cTs[caras[i]._2].x, cTs[caras[i]._2].y); glVertex3f(vertices[caras[i]._2].x, vertices[caras[i]._2].y ,vertices[caras[i]._2].z); } glEnd(); glFlush(); glDisable(GL_TEXTURE_2D); }

Wherein caras is "faces", normales is "normal" and vertices is "vertex".

So, if you want draw the texture, only you call the function.

glEnable(GL_LIGHTING); figuraPerfilCompleto.dibujarTexturaIluminacionPlana2(texturas[0]); glDisable(GL_LIGHTING);

Не necesary вызов glTexEnv ...

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