После всей этой теории, давайте приступим собственно к OpenGL. Начнем с рассмотрения окружающего света.
Прежде всего, нам потребуются некоторые переменные для хранения параметров нашего освещения. Свет (как было упомянуто ранее) задается четырьмя параметрами, так что мы возьмем array[0..3] of double.
Теперь произведем инициализацию. Если вам непонятно, что здесь происходит, то прочитайте последнюю главу еще раз.
glShadeModel(GL_SMOOTH); // Set Shading Model AmbientLight[0] := 1.0; AmbientLight[1] := 1.0; AmbientLight[2] := 1.0; AmbientLight[3] := 1.0; glEnable(GL_LIGHTING); glLightModelfv(GL_LIGHT_MODEL_AMBIENT, @AmbientLight); glEnable(GL_COLOR_MATERIAL); glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);
Сначала мы задали теневую модель. Это — способ вычисления теней. Мы выбрали GL_SMOOTH.
Затем мы определили интенсивность окружающего света. Этот сделано путем задания значений от 0.0 до 1.0 элементам массива.
Теперь мы активируем освещенность в OpenGL. На данный момент у нас есть только окружающий свет, так что нет надобности задавать другие параметры. Модель освещения определяется с помощью glLightModelfv. Так мы сообщаем OpenGL, какой тип света мы желаем использовать, и передаем ему наш массив.
Потом переходим к материалу. Мы устанавливаем его посредством glColorMaterial. Это It is the way наши поверхности взаимодействуют с освещением.
В основном это все. Поскольку здесь мы имеем дело с окружающим светом, нам не надо указывать местоположение источника. Мы просто нарисуем сцену и повращаем ее.
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);
glBegin(GL_QUADS);
glColor3f( 0.0, 0.0, 0.5 );
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();
glTranslatef( 0.0, 0.0, 3.0);
glColor3f( 0.7, 0.0, 0.0 );
glBegin(GL_QUADS);
glVertex3f( 3.0,-3.0, 3.0);
glVertex3f( 3.0, 3.0, 3.0); // oben
glVertex3f(-3.0, 3.0, 3.0);
glVertex3f(-3.0,-3.0, 3.0);
glVertex3f( 3.0, 3.0,-3.0);
glVertex3f( 3.0, 3.0, 3.0); // rechts
glVertex3f( 3.0,-3.0, 3.0);
glVertex3f( 3.0,-3.0,-3.0);
glVertex3f(-3.0, 3.0, 3.0);
glVertex3f(-3.0, 3.0,-3.0); // links
glVertex3f(-3.0,-3.0,-3.0);
glVertex3f(-3.0,-3.0, 3.0);
glVertex3f( 3.0, 3.0, 3.0);
glVertex3f( 3.0, 3.0,-3.0); // hinten
glVertex3f(-3.0, 3.0,-3.0);
glVertex3f(-3.0, 3.0, 3.0);
glVertex3f( 3.0,-3.0,-3.0);
glVertex3f( 3.0,-3.0, 3.0); // vorne
glVertex3f(-3.0,-3.0, 3.0);
glVertex3f(-3.0,-3.0,-3.0);
glEnd();
end;
До полноценного примера пока недостает, ведь это только окружающий свет. Скачайте исходный код и можете позабавляться с ним.
| FPC | 3.2.2 | release |
| Lazarus | 3.2 | release |
| MSE | 5.10.0 | release |
| fpGUI | 1.4.1 | release |