Книги

OpenGL / FPC - Глава 14

Так как теперь настала очередь рассеяного света, вам действительно необходимо понимать теорию, изложенную в главе 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 отвечает "прямо в этой точке", а свет распространяется из этой точки по сфере.

Начиная с этого момента, нам потребуется строить нормаль к каждой построенной поверхности!

Возьмите исходник примера. В нем нарисована также небольшая метка, обозначающая источник света. Поупражняйтесь немного. Сделайте источник вращающимся и посмотрите, что произойдет. Измените параметры освещения. Пробуйте, знакомьтесь, осваивайте.

Актуальные версии
FPC3.2.2release
Lazarus3.2release
MSE5.10.0release
fpGUI1.4.1release
links