VR
Virtual Reality On-line   OpenGL
Новости   |     Журнал    |    Хаkер   |     Магазин   |   Проекты
[   Вход    ]
[Kарта сайтa]
[ Download  ]
[  Конкурс  ]
[  Анекдоты ]
[  Ссылки   ]
[  Реклама  ]
[ Почтальон ]
[ О проекте ]






TopList
OpenGL+Delphi.
Освещение
:

Мы практически подобрались к концу наших занятий по OpenGL. Практически все основы я уже дал, и со следующих номеров мы будем заниматься только практикой. Освоив освещение, ты сможешь уже сам создавать полноценную 3D анимацию. А я только буду тебе помогать, выкладывая на свои странички различные примеры. Таким образом, ты увидишь все тонкости прелести OpenGL.
Logo
Рис 1. Результат

Как и все остальные примочки, освещение включается с помощью команды glEnable . Без освещения наши сцены трудно назвать трёхмерными, потому что конус выглядит как треугольник или вообще не понятно что, а сфера выглядит как круг. Без освещения объект выглядит монотонно и практически незаметны его загогулины и выпиндрёжы.

По умолчанию освещённость отключена, но когда ты её включишь, то рассеянный свет примет значение (0.2, 0.2, 0.2, 1). Это практически минимальная освещённость. Максимальная равна (1, 1, 1, 1).

Параметры освещения задаются с помощью команды glLightModel. Для этой команды нужны два параметры.

  • Параметр света, который нужно изменить.
  • Значение

    Если ты будешь вызывать эту функцию как glLightModelf или glLightModeli (разница в последних буквах), то первый параметр сможет принимать значения GL_ LIGHT_ MODEL_ LOCAL_ VIEWER или GL_ LIGHT_ MODEL_ TWO_ SIDE, а второй GL_TRUE или GL_FALSE.

    Если функция будет выглядеть как glLightModelfv или glLightModeliv, то первый параметр сможет выглядеть как GL_LIGHT_MODEL_AMBIENT, GL_LIGHT_MODEL_LOCAL_VIEWER или GL_LIGHT_MODEL_TWO_SIDE, а второй параметр - массив значений.

    Вот как будет выглядеть установка значения рассеянного света в синий цвет:

    const
      ambient : Array [0..3] of GLFloat = (0.0, 0.0, 1.0, 1.0);
    begin
     glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambient);
    end;
    

    Прежде чем приступить к дальнейшему изучению освещённости нам необходимо ещё понять как работать с материалами. Освещённость объекта зависит от материала объекта. Это ни чем не отличается от реального мира. Например, метал имеет менее освещённую поверхность из-за его меньшей отражающей способности, полимеры тоже имеют свои особенности в зависимости от состава. Материал может как отражать, так и излучать свет.

    Свойства материала устанавливаются с помощью функции glMaterialfv. Для неё нужно три параметра:

  • Первый параметр - это грань к которой будет применён материал. GL_BACK - задняя грань, GL_FONT - передняя грань и GL_FRONT_AND_BACK - обе грани.
  • Второй параметр - свойства материала. Может быть: GL_AMBIENT - рассеянный свет, GL_DIFFUSE - рассеянный свет, GL_SPECULAR - отраженный свет, GL_EMISSION - излучаемый свет, GL_SHININESS - степень отраженного света, GL_AMBIENT_AND_DIFFUSE - оба рассеянных света.
  • Третий параметр - значение цвета в формате RGBA.

    С теорией покончено. Теперь посмотрим на пример и после него немного поднимем свои знания об освещённости.

    procedure TForm1.FormPaint(Sender: TObject);
    const
     emission : Array [0..3] of GLFloat = (0.0, 0.0, 1.0, 1.0);
     ambient : Array [0..3] of GLFloat = (0.0, 0.0, 1.0, 1.0);
     diffuse : Array [0..3] of GLFloat = (1.0, 0.0, 0.0, 1.0);
     pos : Array [0..3] of GLFloat = (5.0, 10.0, -20.0, 1.0);
     shiness : GLFloat = 70.0;
    var
     ps:TPaintStruct;
    begin
     BeginPaint(Handle,ps);
     glClearColor(1,0.5,0.5,1);
     glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
    
    //Включаю освещение
     glEnable(GL_LIGHTING);
     glEnable(GL_LIGHT0);
    
    //Задаю позицию источника света
     glLightfv(GL_LIGHT0, GL_POSITION, @Pos);
    
     glPushMatrix;
      glRotated(45,1,0,0);
    
    //Синий материал для сферы
      glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, @emission );
      glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, @ambient);
      glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS,@shiness );
    
      gluQuadricDrawStyle (quadObj, GLU_FILL);
      glColor3f(1,0,0);
      gluSphere (quadObj,1, 100, 10);
    
    //Сине-красный материал для конусов.
      glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, @emission );
      glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, @diffuse);
      glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE,@diffuse  );
      glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR,@diffuse);
      glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS,@shiness );
    
      glTranslatef(1.5,1,1);
      gluCylinder (quadObj,0, 0.2, 1, 30, 10);
      gluDisk (quadObj, 0.2, 0.3, 20, 2);
      glTranslatef(-3,0,0);
      gluCylinder (quadObj,0, 0.2, 1, 30, 10);
      gluDisk (quadObj, 0.2, 0.3, 20, 2);
     glPopMatrix;
    
     glFlush();
     swapBuffers(dc);
     EndPaint(Handle,ps);
    end;
    

    В наиболее интересных местах я поставил комментарии. Единственное, что я забыл рассказать, так это про функцию glLightfv. Она устанавливает параметры света и требует три параметра:

  • Номер источника света. Они нумеруются как GL_LIGHT0, GL_LIGHT1, GL_LIGHT2 и так до GL_LIGHT9. Как я уже говорил, источник включается с помощью glEnable(GL_LIGHT0), в скобках указан номер источника.
  • Параметр, который нужно изменить: GL_POSITION (позиция источника) или GL_SPOT_DIRECTION (позиция точки в которую светит источник).
  • Значение устанавливаемого параметра.

    Вот и всё. Да будет свет сказал программист и выключил Back-UPS. Теперь я с уверенностью могу сказать, что со светом мы покончили. В будущих номерах я буду выкладывать демки, в которых более подробно расскажу о хитростях и о свете (с маленькой буквы:)) тоже.

    Удачи, надеюсь, что увидимся.

     Исходники примера забирай здесь Заголовочные файлы возьми на моей страничке в разделе "Полезности".


  • Copyright©: Horrific aka Флёнов Михаил
    Design by FMk group©