Установка отдельных свойств материала для разных объектов в OpenGL - PullRequest
5 голосов
/ 12 октября 2011

Как я могу иметь отдельные свойства материала для разных объектов, нарисованных в OpenGL? Я сделал следующий код, который, видимо, показывает только более поздний цвет:

//************** Object 1 **************
glEnable(GL_COLOR_MATERIAL);
glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);
glColor4f(149.0/255.0, 78.0/255.0, 22.0/255.0, 1.0);
float mat_specular[] = {0.992157, 0.941176, 0.807843, 1.0};
float shininess = 10;

glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
glMaterialf(GL_FRONT, GL_SHININESS, shininess);

glPushMatrix();
glTranslatef(0, 3.0, 0);
drawSphere(0.1, 0.1, 0.1);
glRotatef(10, 1, 0, 0);

glDisable(GL_COLOR_MATERIAL);


//************** Object 2 *****************
glEnable(GL_COLOR_MATERIAL);
glColorMaterial(GL_FRONT, GL_DIFFUSE);
glColor4f(48.0/255.0, 48.0/255.0, 48.0/255.0, 1.0);
float mat_specular_2[] = {0.992157, 0.941176, 0.807843, 1.0};
float shininess_2 = 10;

glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular_2);
glMaterialf(GL_FRONT, GL_SHININESS, shininess_2);

glPushMatrix();
glTranslatef(-0.6, 0.2, 1.6/2.0);
drawSphere(0.1, 0.1, 0.1);
glPopMatrix();

glDisable(GL_COLOR_MATERIAL);

При визуализации цвет, установленный для Объекта 2, используется для всей сцены. Таким образом, Объект 1 также отображается в цвете Объекта 2, несмотря на то, что у него уже установлен собственный цвет.

Как можно, чтобы 2 объекта имели отдельные свойства материала, чтобы их можно было отображать разными цветами, а не одним цветом во всей сцене?

Ответы [ 3 ]

3 голосов
/ 19 мая 2012

Вы должны поставить:

glEnable(GL_COLOR_MATERIAL);

Первым делом в вашей функции рендеринга установите параметры освещения:

glDisable(GL_COLOR_MATERIAL);
glPushMatrix();

Затем установите свойства материала и вызовите объект. Все объекты отныне будут иметь это свойство, если вы хотите использовать другой материал для другого объекта, просто введите:

glDisable(GL_COLOR_MATERIAL);

еще раз, до моделирования второго объекта и так далее. Если у вас остались вопросы, просто спросите.

1 голос
/ 12 октября 2011

Во-первых, ваш пример кода выглядит разумно, и ваши объекты действительно должны иметь разные материалы.

Но имейте в виду, что вы изменяете цвет рассеянного материала только для второго объекта, так как вы устанавливаете одинаковые зеркальные цвета и значения блеска для обоих объектов. И окружение второго объекта также такое же, как и для первого, поскольку вы включаете только цветной материал для диффузного канала, поэтому окружение остается неизменным по сравнению с первым объектом, так как OpenGL является конечным автоматом .

Таким образом, единственное материальное различие между объектами - это их рассеянный цвет, и это различие (101, 30, 26). Так может ли быть так, что эта разница просто перевешивается внешними и зеркальными терминами, которые абсолютно равны и поэтому слишком малы, чтобы вы могли их заметить? Попробуйте совершенно разные материалы и посмотрите, нет ли на самом деле никакой разницы.

0 голосов
/ 28 апреля 2012

Кажется, вы пропустили glPopMatrix после рисования первого объекта. Я не знаю, как это изменило бы вещи.

...