Так как теперь настала очередь рассеяного света, вам действительно необходимо понимать теорию, изложенную в главе 12. Если нет, распечатайте ее, и тупо смотрите, пока не поймете, что к чему.
Мы создали массив для окружающего света. Теперь нам нужны еще два новых массива. Один — для параметров рассеяного света, а второй — для положения источника. Вместо создания массива в процедуре OpenGL_Init
, мы определим их в качестве глобальных переменных.
AmbientLight : array[0..3] of glFloat = (0.3,0.3,0.3,1.0); DiffuseLight : array[0..3] of glFloat = (1.0,1.0,1.0,1.0); LightPosition : array[0..3] of glFloat = (0.0,0.0,0.0,1.0);
Также необходимо изменить OpenGL_Init
в нескольких местах. Вот новые строки.
glEnable(GL_LIGHTING); // Enable Lighting glLightfv(GL_LIGHT0,GL_AMBIENT, @AmbientLight); glLightfv(GL_LIGHT0,GL_DIFFUSE, @DiffuseLight); glEnable(GL_LIGHT0); glLightfv(GL_LIGHT0,GL_POSITION,@LightPosition);
На этот раз мы определили свет с id LIGHT0
. Сначала задали окружающую часть освещения при помощи glLightfv(GL_LIGHT0,GL_AMBIENT, @AmbientLight);
. Затем установили рассеяную часть похожим образом, и активировали освещенность. После этого мы задали положение источника.
А вот и соответствующая процедура Draw_OpenGL
.
procedure Draw_OpenGL; begin glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); glLoadIdentity(); glTranslatef( 0.0,-5.0,-50.0); glRotatef( 80,-1.0, 0.0, 0.0); glRotatef( rotation, 0.0, 0.0, 1.0); LightPosition[0] := 3.0; LightPosition[1] := 5.0; LightPosition[2] := 5.0; LightPosition[3] := 0.5; glLightfv(GL_LIGHT0,GL_POSITION,@LightPosition); glBegin(GL_QUADS); glColor3f( 0.0, 0.0, 0.5 ); glNormal3f(0.0, 0.0, 1.0); glVertex3f( 10.0,-10.0, 0.0); glVertex3f( 10.0, 10.0, 0.0); glVertex3f(-10.0, 10.0, 0.0); glVertex3f(-10.0,-10.0, 0.0); glEnd();
Мы задали положение источника за четырехугольником. Затем указали OpenGL использовать это новое положение.
Как вы видите, положение источника света описывается четырьмя параметрами. Первые три — это координаты X/ Y/ Z. Последняя — это протяженность источника. 0.0 соответствует "бесконечному удалению", то есть свет достигает поверхности параллельным пучком. Значению 1.0 отвечает "прямо в этой точке", а свет распространяется из этой точки по сфере.
Начиная с этого момента, нам потребуется строить нормаль к каждой построенной поверхности!
Возьмите исходник примера. В нем нарисована также небольшая метка, обозначающая источник света. Поупражняйтесь немного. Сделайте источник вращающимся и посмотрите, что произойдет. Измените параметры освещения. Пробуйте, знакомьтесь, осваивайте.