Шаг 42 - Два источника света

Этот шаг не сильно отличается от предыдущего. Просто добавили еще 1 источник света. Мелкая хитрость состоит в том, что в OpenGL первый (т.е. нулевой) источник всегда как бы включен, т.е. излучает по оси Z с интенсивностью 1.0, 1.0, 1.0, 0.0 по всем составляющим света. Второй источник надо просто включить.

Зададим положение и интенсивность 2-го источника:

GLfloat	light1_Position[4] = {0.0f, 0.0f, -2.5f, 1.0f};
GLfloat	light1_Intensity[4] = {1.0f, 1.0f, 1.0f, 1.0f};

Теперь в функции StartRC включим его:

glEnable(GL_LIGHT1);

и дадим ему определенный тип:

glLightfv(GL_LIGHT1, GL_DIFFUSE, light1_Intensity);

Источники света в принципе бывают рассеяные (т.е. diffuse) и направленные (т.е. ambient), которые могут быть как бесконечно удалены (т.е. лучи идут как бы параллельно), так и типа прожектора с определенной диаграммой направленности. Вообще-то свойств у источников света достаточно много и они связаны с еще большим количеством свойств материалов объектов. Если мне не будет лень, то постепенно пройдемся по многим из них ;)

Теперь посмотрим на функцию Draw():

GLvoid Draw()
{
	static GLfloat rot = 0.0f;

	glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

	glPushMatrix();
	glColor3f (1.0, 1.0, 0.5);
	glCallList(CUBE_LIST);
	glRotatef(rot, 0.0f, 1.0f, 1.0f);

	glPushMatrix();
	glLightfv(GL_LIGHT0, GL_POSITION, light0_Position);
	glTranslatef(light0_Position[0],light0_Position[1],light0_Position[2]);
	glScalef(0.1f, 0.1f, 0.1f);
	glCallList(CUBE_LIST);
	glPopMatrix();

	// ------------ Start New Block --------------
	glPushMatrix();
	glLightfv(GL_LIGHT1, GL_POSITION, light1_Position);
	glRotatef(rot, 1.0f, 0.0f, 0.0f);
	glTranslatef(light1_Position[0],light1_Position[1],light1_Position[2]);
	glScalef(0.1f, 0.1f, 0.1f);
	DrawCube();
	glPopMatrix();
	// ------------ End New Block ----------------

	rot+=1.0f;
	glPopMatrix();

	SwapBuffers(hDC);
}

Новый код находится между символами комментариев. Если посмотреть повнимательнее, то он копирует блок кода идущий чуть выше, за исключением еще одной функции glRotatef, которая просто вращает источник вокруг X-а. Смысла никакого, но хоть немного повеселее чем по кругу.


Загрузить проект | Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Kirill V. Ratkin - 5.06.2000