Изменение свойств материала
Ниже приведен фрагмент программы 6.1 (часть функции display()) для рисования четырех сфер, расположенных в одной строке. Для этих сфер выбираются различные свойства материала.
float no_mat[] = { 0.0, 0.0, 0.0, 1.0 }; float mat_ambient[] = { 0.7, 0.7, 0.7, 1.0 }; float mat_ambient_color[] = { 0.8, 0.8, 0.2, 1.0 }; float mat_diffuse[] = { 0.1, 0.5, 0.8, 1.0 }; float mat_specular[] = { 1.0, 1.0, 1.0, 1.0 }; float no_shininess[] = { 0.0 }; float low_shininess[] = { 5.0 }; float high_shininess[] = { 100.0 }; float mat_emission[] = {0.3, 0.2, 0.2, 0.0};
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
/* Рисование сферы в первой строке, первом столбце только с диффузным отражением, без рассеянной и зеркальной компонент */ glPushMatrix(); glTranslatef (-3.75, 3.0, 0.0); glMaterialfv(GL_FRONT, GL_AMBIENT, no_mat); glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse); glMaterialfv(GL_FRONT, GL_SPECULAR, no_mat); glMaterialfv(GL_FRONT, GL_SHININESS, no_shininess); glMaterialfv(GL_FRONT, GL_EMISSION, no_mat); auxSolidSphere(1.0); glPopMatrix();
/* Рисование сферы в первой строке, втором столбце с диффузным и зеркальным отражением. Малый блеск, нет рассеянной компоненты */ glPushMatrix(); glTranslatef (-1.25, 3.0, 0.0); glMaterialfv(GL_FRONT, GL_AMBIENT, no_mat); glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse); glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular); glMaterialfv(GL_FRONT, GL_SHININESS, low_shininess); glMaterialfv(GL_FRONT, GL_EMISSION, no_mat); auxSolidSphere(1.0); glPopMatrix();
/* Рисование сферы в первой строке, третьем столбце с диффузным и зеркальным отражением. Высокий блеск, нет рассеянной компоненты */ glPushMatrix(); glTranslatef (1.25, 3.0, 0.0); glMaterialfv(GL_FRONT, GL_AMBIENT, no_mat); glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse); glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular); glMaterialfv(GL_FRONT, GL_SHININESS, high_shininess); glMaterialfv(GL_FRONT, GL_EMISSION, no_mat); auxSolidSphere(1.0); glPopMatrix();
/* Рисование сферы в первой строке, четвертом столбце с диффузным отражением и излучением. Нет рассеянной и зеркальной компонент */ glPushMatrix(); glTranslatef (3.75, 3.0, 0.0); glMaterialfv(GL_FRONT, GL_AMBIENT, no_mat); glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse); glMaterialfv(GL_FRONT, GL_SPECULAR, no_mat); glMaterialfv(GL_FRONT, GL_SHININESS, no_shininess);
glMaterialfv(GL_FRONT, GL_EMISSION, mat_emission); auxSolidSphere(1.0); glPopMatrix(); Фрагмент программы 6.1. Использование материалов с различными свойствами.
Функция glMaterialfv() в программе 6.1 для задания свойств материала каждой сферы вызывается по несколько раз. Но ее можно вызывать только для тех свойств, значения которых надо изменить. Например, рассеянная и диффузная компоненты второй и третьей сферы совпадают с соответствующими значениями первой сферы. Поэтому эти свойства повторно можно не устанавливать. Вызов glMaterial*() требует некоторого времени, поэтому для увеличения скорости работы программы надо стараться уменьшать количество изменений свойств материала. Кроме явных вызовов функции glMaterial*(), в OpenGL есть еще одно средство изменения свойств материала – функция glColorMaterial(): void glColorMaterial(GLenum face, GLenum mode); Эта функция позволяет установить режим, при котором свойства материала будут автоматически изменяться при задании текущего цвета (функцией glColor*()). Текущий цвет будет присваиваться свойствам материала mode для сторон face. Параметр face может быть GL_FRONT, GL_BACK или GL_FRONT_AND_BACK (по умолчанию). Допустимые значения параметра mode – константы GL_AMBIENT, GL_DIFFUSE, GL_AMBIENT_AND_DIFFUSE (по умолчанию), GL_SPECULAR или GL_EMISSION. Чтобы режим синхронного задания текущего цвета и свойств материала начал работать, надо после вызова glColorMaterial() вызвать функцию glEnable(GL_COLOR_MATERIAL). В предыдущих лекциях свойства материала задавались именно так, например: glColorMaterial(GL_FRONT, GL_DIFFUSE); glEnable(GL_COLOR_MATERIAL); glColor3f(0.2, 0.5, 0.8); // рисование каких-либо объектов glColor3f(0.9, 0.0, 0.2); // рисование каких-либо объектов glDisable(GL_COLOR_MATERIAL); Функцию glColorMaterial() удобно применять в тех случаях, когда для объектов сцены изменяется только одно свойство материала. Если требуется менять несколько, то придется выполнять отдельные вызовы glMaterial*(). Для отключения режима glColorMaterial()надо вызвать glDisable(GL_COLOR_MATERIAL). Далее приведена программа 6.2, которая позволяет в интерактивном режиме проверить работу функции glColorMaterial(). По нажатию трех клавиш курсора (стрелка влево, вверх и вправо) эта программа циклически изменяет одну из компонент цвета диффузного отражения.
#include <windows.h> #include <GL/gl.h> #include <GL/glu.h> #include <GL/glaux.h>
float diffuseMaterial[4] = { 0.5, 0.5, 0.5, 1.0 };
void light_init() { float mat_specular[] = { 1.0, 1.0, 1.0, 1.0 }; float light_position[] = { 1.0, 1.0, 1.0, 0.0 };
glMaterialfv(GL_FRONT, GL_DIFFUSE, diffuseMaterial); glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular); glMaterialf(GL_FRONT, GL_SHININESS, 25.0); glLightfv(GL_LIGHT0, GL_POSITION, light_position);
glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); glDepthFunc(GL_LEQUAL); glEnable(GL_DEPTH_TEST);
glColorMaterial(GL_FRONT, GL_DIFFUSE); glEnable(GL_COLOR_MATERIAL); }
void CALLBACK changeRedDiffuse() { diffuseMaterial[0] += 0.1f; if (diffuseMaterial[0] > 1.0) diffuseMaterial[0] = 0.0; glColor4fv(diffuseMaterial); }
void CALLBACK changeGreenDiffuse() { diffuseMaterial[1] += 0.1f; if (diffuseMaterial[1] > 1.0) diffuseMaterial[1] = 0.0; glColor4fv(diffuseMaterial); }
void CALLBACK changeBlueDiffuse() { diffuseMaterial[2] += 0.1f; if (diffuseMaterial[2] > 1.0) diffuseMaterial[2] = 0.0; glColor4fv(diffuseMaterial); }
void CALLBACK display() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); auxSolidSphere(1.0); glFlush(); }
void CALLBACK resize(int w, int h) { glViewport(0, 0, w, h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); if (w <= h) glOrtho(-1.5, 1.5, -1.5*(float)h/(float)w, 1.5*(float)h/(float)w, -10.0, 10.0); else glOrtho(-1.5*(float)w/(float)h, 1.5*(float)w/(float)h, -1.5, 1.5, -10.0, 10.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); }
void main() { auxInitDisplayMode(AUX_SINGLE | AUX_RGBA | AUX_DEPTH); auxInitPosition(0, 0, 400, 400); auxInitWindow("Лекция 6. Программа 6.2"); light_init(); auxKeyFunc(AUX_LEFT, changeRedDiffuse); auxKeyFunc(AUX_UP, changeGreenDiffuse); auxKeyFunc(AUX_RIGHT, changeBlueDiffuse); auxReshapeFunc(resize); auxMainLoop(display); } Программа 6.2. Изменение свойств материала с помощью glColorMaterial().
Имитация реальных материалов В табл. 6.2 приведены значения свойств, подобранных с целью имитации отражения/поглощения света предметами, изготовленными из нескольких реальных материалов, например, бронзы и золота.
Таблица 6.2. Значения свойств для некоторых часто используемых материалов
Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|