- Осторожно Включение цветного материала
Функция материала цвета OpenGL обеспечивает менее дорогостоящий способ изменить параметры материала. При включенном цветовом материале материал цвета отслеживают текущий цвет. Это означает, что вместо использования относительно дорогостоящая процедура glMaterialfv
, вы можете использовать glColor3f
.
Вот пример использования функции цветного материала для изменения диффузный цвет для каждой вершины треугольника:
glColorMaterial(GL_FRONT, GL_DIFFUSE);
glEnable(GL_COLOR_MATERIAL);
glBegin(GL_TRIANGLES);
glColor3f(0.2, 0.5, 0.8);
glVertex3f(1.0, 0.0, 0.0);
glColor3f(0.3, 0.5, 0.6);
glVertex3f(0.0, 0.0, 0.0);
glColor3f(0.4, 0.2, 0.2);
glVertex3f(1.0, 1.0, 0.0);
glEnd();
Рассмотрим более дорогую кодовую последовательность, если glMaterialfv
явно используется:
GLfloat d1[] = { 0.2, 0.5, 0.8, 1.0 };
GLfloat d2[] = { 0.3, 0.5, 0.6, 1.0 };
GLfloat d3[] = { 0.4, 0.2, 0.2, 1.0 };
glBegin(GL_TRIANGLES);
glMaterialfv(GL_FRONT,GL_DIFFUSE,d1);
glVertex3f(1.0, 0.0, 0.0);
glMaterialfv(GL_FRONT,GL_DIFFUSE,d2);
glVertex3f(0.0, 0.0, 0.0);
glMaterialfv(GL_FRONT,GL_DIFFUSE,d3);
glVertex3f(1.0, 1.0, 0.0);
glEnd();
Если вы рендерите объекты, требующие частого простого материала изменения, попробуйте использовать режим цветных материалов. Однако существует общая ошибка, возникающая при включении режима цветного материала. когда цветной материал включен, OpenGL немедленно изменяет материал цвета, контролируемые состоянием цветного материала. Рассмотрим следующее фрагмент кода для инициализации нового контекста рендеринга OpenGL:
GLfloat a[] = { 0.1, 0.1, 0.1, 1.0 };
glColor4f(1.0, 1.0, 1.0, 1.0);
glMaterialfv(GL_FRONT, GL_AMBIENT, a);
glEnable(GL_COLOR_MATERIAL); /* WARNING: Ambient and diffuse material latch immediately to the current color. */
glColorMaterial(GL_FRONT, GL_DIFFUSE);
glColor3f(0.3, 0.5, 0.6);
В каком состоянии будут отображаться цвета передних окружающих и диффузных материалов выполнение вышеуказанного фрагмента кода? Хотя программист может иметь Предполагалось, что состояние окружающего материала должно быть (0.1, 0.1, 0.1, 1.0)
и состояние диффузного материала (0.3, 0.5, 0.6, 1.0)
, то есть что происходит.
Результирующее состояние диффузного материала - это то, что планировал программист, но полученное состояние окружающего материала довольно неожиданно (1.0,
1.0, 1.0, 1.0)
. Как это произошло? Ну, помните, что режим цветного материала сразу начинает отслеживать текущий цвет, когда включен. Начальное значение для параметров цветового материала GL_FRONT_AND_BACK
и GL_AMBIENT_AND_DIFFUSE
(вероятно, не то, что вы ожидали!).
Так как включение режима цветного материала сразу начинает отслеживать текущий цвет, как состояния окружающего, так и диффузного материала обновлено до (1.0, 1.0, 1.0, 1.0)
. Обратите внимание, что эффект начальный glMaterialfv
теряется. Далее, состояние цветного материала чтобы просто изменить передний диффузный материал. Наконец, Вызов glColor3f
изменяет диффузный материал на (0.3, 0.5,
0.6, 1.0)
. Состояние окружающего материала заканчивается (1.0, 1.0, 1.0, 1.0)
.
Проблема в фрагменте кода выше заключается в том, что режим цветного материала активируется перед вызовом glColorMaterial
. Режим цветного материала очень эффективен для эффективных простых изменений материала, но избегать приведенная выше ошибка, всегда будьте осторожны, чтобы установить glColorMaterial
до вы включаете GL_COLOR_MATERIAL
.