SlideShare a Scribd company logo
1 of 27
Download to read offline
Saxion Hogeschool Enschede




 D YNAMIC L IGHTING
 Implementatie in OpenGL


 In dit document wordt uiteengezet hoe dynamische verlichting met
 behulp van OpenGL kan worden gesimuleerd. Naast een
 uitgebreide introductie van het fenomeen “licht”, bevat dit verslag
 tevens een met wiskundige berekeningen onderbouwde handleiding
 voor toepassing van de materie in OpenGL in combinatie met c++.




 Jeroen Rosenberg
 31-3-2008
1    Dynamic Lighting



    Voorwoord
    Dit document is geschreven in het kader van een studietaak voor het vak
    “computer graphics”, als onderdeel van het derde studiejaar van de opleiding
    Informatica aan de Saxion Hogeschool te Enschede.

    Het verslag voert ons terug naar de oorsprong van licht, waardoor het de lezer
    aan de nodige basiskennis in de rest van het document niet zal ontbreken.
    Vervolgens wordt uitgebreid aandacht besteed aan de mogelijkheden van
    OpenGL met betrekking tot het ontwerp van lichtmodellen. Na het lezen van dit
    document beschikt de lezer hopelijk over voldoende kennis om de beschreven
    theorie in praktijk te kunnen brengen.




                    Saxion Hogeschool Enschede | De oorsprong van licht
2    Dynamic Lighting



    Inhoudsopgave
    1. De oorsprong van licht ......................................................................... 3
      1.1 Een stroom van deeltjes of een golf van energie ................................... 3
      1.2 De kleur van licht ............................................................................. 4
      1.3 Abstracte typen licht ......................................................................... 6
        1.3.1 Ambient light ............................................................................. 8
        1.3.2 Diffuse light ............................................................................... 9
        1.3.3 Specular light ........................................................................... 11
        1.3.4 Emissive light ........................................................................... 12
      1.4 Berekening van het licht op een willekeurig object .............................. 13
    2. Licht in OpenGL ................................................................................ 14
      2.1 Lighting en shading models ............................................................. 14
        2.1.1 Object shading ......................................................................... 14
        2.1.2 Light Models............................................................................. 14
        2.1.3 Global ambient light model ......................................................... 15
        2.1.4 Smooth shading ....................................................................... 15
        2.1.5 Lichttypen ............................................................................... 16
           2.1.5.1 Definiëring van een lichtbron................................................. 16
           2.1.5.2 In- en uitschakeling van een lichtbron .................................... 17
           2.1.5.3 Het definiëren van oppervlakmateriaal.................................... 18
           2.1.5.4 Polygon winding .................................................................. 19
           2.1.5.5 Materiaal eigenschappen ...................................................... 20
           2.1.5.6 Overige eigenschappen ........................................................ 22
      2.2 Normaal berekening ....................................................................... 23
        2.2.1 Berekening van de vectoren ....................................................... 24
        2.2.2 Berekening van het uitwendig product ......................................... 25
        2.2.3 Normaliseren van de normaal ..................................................... 26




                         Saxion Hogeschool Enschede | De oorsprong van licht
3    Dynamic Lighting



       1.       DE OORSPRONG VAN LICHT
    Licht is het belangrijkste aspect achter visuele representatie van elk willekeurig
    signaal dat een mens visueel waarneemt. Perceptie van licht vindt zijn oorsprong
    in het feit dat wat men kan zien niet gebaseerd is op de objecten die men
    bekijkt, maar op de reflectie van lichtstralen, die uitgezonden zijn vanuit een
    lichtbron, door deze objecten. Het is belangrijk om te beseffen dat onze ogen
    objecten niet direct zien, omdat hier tussen geen lichamelijke correlatie bestaat.

    Lichtstralen reizen theoretisch in een rechte lijn. Op het moment dat men een
    object visueel waarneemt, zijn het deze lichtstralen die door dat object
    gereflecteerd of verstrooid zijn. Bij het programmeren van een 3D licht engine,
    waarbij men gebruik maakt van de OpenGL lichtmodellering functies, is het
    belangrijk de volgende twee regels te begrijpen:

            Je ogen zijn mechanismen die gemaakt zijn om deeltjes van licht waar te
            nemen en niet de objecten zelf. Als een programmeur zul je deze werking
            op het computer scherm moeten simuleren.

            Een lichtstraal reist in een rechte lijn.

    1.1 Een stroom van deeltjes of een golf van energie
    Het laatstgenoemde punt hoeft niet per definitie waar te zijn. Er zijn twee
    manieren om licht te beschouwen. Een theorie beschrijft het licht als een stroom
    van deeltjes. Een tweede theorie ziet licht als een golf van energie. De oude
    Grieken zagen licht als een stroom van deeltjes die reizen in een rechte lijn en
    tegen een muur kaatsen op dezelfde manier als andere fysieke objecten doen.
    Men kon het licht niet zien, omdat de deeltjes simpelweg te klein of te snel voor
    het oog waren.

    In de zeventiende eeuw werd voorgesteld dat licht een golf van energie was die
    niet exact in een rechte lijn reisde. Dit werd in het jaar 1807 bevestigd met een
    experiment dat demonstreerde dat het licht, wanneer het een smalle opening
    passeerde, extra licht uitstraalde aan de andere kant van de opening. Hierdoor
    was bewezen dat het licht zich in de vorm van een golf moest verplaatsen om
    zich op deze manier te spreiden.

    Albert Einstein ontwikkelde de theorie van licht verder in het jaar 1905. Hij sprak
    van het “foto-elektrische effect”, waarbij ultraviolet licht elektronen van het
    oppervlak dat het raakte uitstraalde. Deze theorie beschouwde licht als een
    stroom van energie pakketjes, de zogenaamde fotonen.

    Hieruit kunnen we concluderen dat licht zich zowel als een golf als pakketjes van
    energie deeltjes (fotonen) kan gedragen.




                      Saxion Hogeschool Enschede | De oorsprong van licht
4      namic Lighting
     Dyn



    1.2 De kleu van lic
              ur      cht
    Het licht dat he menselijk oog kan zien bestaa in het alg
                    et          ke                      at         gemeen uit een mix
    van allerlei soor
                    rten licht ve
                                erstrooid en weerkaatst tegen de o
                                                        t         omringende objecten
    met elk hun eigen materiaal eigensc     chappen. Alle fysieke ddeeltjes bestaan uit
    atom
       men. De manier van ref    flectie van f
                                             fotonen doo fysieke de
                                                       or          eeltjes hang o.a. af
                                                                              gt
    van het soort a atoom, het a aantal atommen van elk soort en de volgorde van de
                                                       ke
       men in het object dat de fotone weerkaatst. Sommi
    atom                        t           en                     ige fotonen worden
                                                                              n
    weerrkaatst en ssommige ge  eabsorbeerd Dit conce bepaald de visuele kwaliteit
                                             d.        ept
    van materiaal. De kleur lic cht die het materiaal w weerkaatst wordt gezie als de
                                                                              en
    kleur van dat materiaal. Des te me
        r                                   eer licht erd
                                                        door het mmateriaal weeerkaatst
    word des te m
        dt,         meer het lijjkt
    te    glimmen      voor     het
                                h
    menselijk oog.

    Elke    verschillende   kle
                              eur
    bestaaat eenvo oudigweg uitu
    enerrgie die weergegeve    en
    kan     worden     door  eeen
    golfle
         engte die zichtbaar is
    voor het oog. Een golfleng
        r          E          gte
    word gemeten tussen twe
        dt                     ee
    toppen of dalen van ee     en
    enerrgiegolf.




                                          F
                                          Figuur 1 – Een golflengte w
                                                       n            wordt gemete tussen
                                                                               en
                                                        twee toppen of dalen van een golf
                                                                   n           n




                     Saxion Hogeschool En
                                        nschede | D oorsprong van licht
                                                  De
5      namic Lighting
     Dyn



    Het zzichtbare lic ligt tusse de golflengtes variërend van 39 nanometer (violet
                     cht         en                             90
    licht) tot 720 nanometer (rood licht Het segment van golflengtes die hier
         )                                 t).
    tusse liggen wo
         en          ordt het kleurenspectru genoemd.
                                           um




    Figuur 2 – Het kleu
                      urenspectrum
                                 m




                                       Bij het “pr
                                          j      rogramm meren van
                                                                 n
                                       lic
                                         cht” hoev
                                                 ven wij a
                                                         alleen
                                       rekening t houden met
                                                 te
                                       zic
                                         chtbaar llicht.




                      Saxion Hogeschool En
                                         nschede | D oorsprong van licht
                                                   De
6      namic Lighting
     Dyn



    1.3 Abstrac typen licht
              cte   n
    Om het effect vvan licht in OpenGL te begrijpen, is het goed om stil te staan bij
    de drie verschillende soorte lichtbronn
                               en         nen die Ope
                                                    enGL onders scheidt:

            Directio
                   onal lights, waarbij we ons voorstellen dat d lichtbron oneindig
                                            e                      de
            ver weg is, zodat de lichtstralen parallel aa elkaar lop
                               e            n           an         pen.

            Point lig ghts, waarb de lichtb
                                 bij                 catie heeft in de ruimte en licht
                                          bron een loc                      e
            in alle ric
                      chtingen uitzendt.

                   hts, waarbij de lichtbro eveneens een locatie heeft in de ruimte,
            Spotligh                       on       s          e           e
            maar alle
                    een licht uitzendt binne een kegel.
                                           en




    Figuu 3 – Directio
        ur           onal light




                                      Figuu 4– Point lig
                                          ur           ght




    Figuu 5 - Spotligh
        ur           ht
                       Saxion Hogeschool En
                                          nschede | D oorsprong van licht
                                                    De
7       Dynamic Lighting



    Echte lichtbronnen zenden licht uit van area sources (bronnen die licht vanuit
    een bepaald gebied uitzenden) of volume sources (driedimensionale bronnen
    van uitzendend licht). Point lights zijn een redelijke benadering van werkelijke
    lichtbronnen, maar produceren niet altijd visueel correcte informatie. Zo hebben
    schaduwen die gegenereerd worden door point lights scherpe hoeken, terwijl
    schaduwen gegenereerd door echte lichtbronnen een vloeiende rand hebben.1

    Voor het representeren van licht bij het programmeren zijn er een aantal
    abstracte termen die specifieke effecten van licht beschrijven samengevoegd tot
    abstracte typen licht. De terminologie van deze typen is essentieel voor een
    grafische programmeur. Deze set van effecten geeft bij langer na niet alle
    effecten die licht kan produceren weer, maar doet dienst als een redelijke
    benadering hiervan.

    Het is belangrijk om te begrijpen welk effect elk van deze abstracte typen licht
    hebben op het oppervlak van 3D objecten. De typen zijn bedacht omdat het
    noodzakelijk is dat bepaalde effecten van licht op objecten beschreven zijn om
    zo de ingewikkelde wiskundige berekeningen te distilleren. Dit betekent echter
    niet dat deze typen in werkelijkheid bestaan. Het zou erg tijdrovend zijn om de
    werkelijke mechaniek van licht te berekenen. Derhalve onderscheidt OpenGL de
    volgende soorten licht:

             Ambient light (omgevingslicht)

             Diffuse light (diffuus licht)

             Specular light (spiegelend licht)

    Daarnaast kent OpenGL emissive light (uitzendend licht). Deze wordt los
    gezien van de andere typen, omdat het licht beschrijft dat uitgezonden wordt
    door objecten, waar de andere drie typen licht beschrijven afkomstig van een
    lichtbron. Elke lichtbron in OpenGL heeft naast een positie en een richting
    verschillende additionele attributen. Elk licht kan monochroom zijn, een RGB
    kleur en zelfs meerdere kleuren bevatten om de bijdrage van ambient, diffuse en
    specular light te vertegenwoordigen. Ook kan voor deze kleuren de intensiteit
    worden ingesteld en heeft elk licht een flag om aan te geven of het licht aan of
    uit is. De overige attributen zijn afhankelijk van het type licht.

    In de volgende paragrafen worden de verschillende typen licht die OpenGL
    onderscheidt nader toegelicht.




    1
     D.H. Eberly, 3D Game Engine Design, Amsterdam: Morgan Kaufmann
    publishers, 2007, p. 92-94.
                    Saxion Hogeschool Enschede | De oorsprong van licht
8         namic Lighting
        Dyn



    1.3. Ambien light
       .1     nt
    Amb bient light is eigenlijk oo geen ech lichtbron maar het gemiddelde volume
                                  ok        hte        n,         t            e
    van licht dat wo ordt gecreëe door het uitzenden van licht door alle om
                                  erd                                        mringende
         bronnen. Wanneer zon
    lichtb          W             nnestralen door het ra
                                                       aam van e  een kamer schijnen,
    raken ze de muur en worden ze gereflecte          eerd en ve  erstrooid in allerlei
                                                                               n
    verscchillende ric
                     chtingen, wa aardoor de hele kamer verlicht wo
                                                      r           ordt. Dit effe wordt
                                                                               ect
    bereikt door de kleur van het ambient light te co
                                  h          t         ombineren m de kleu van de
                                                                   met         ur
    ambient factor van het mat
                      v           teriaal:




    De   vertegenwwoordigd de scalaire v
                             e         vermenigvuldiging waa
                                                           armee het inwendig
                  berekend2.
    product wordt b

    Door alleen gebruik te mak
       r                        ken van amb             kan een 3D object niet compleet
                                            bient light k
    word
       den weerge   egeven, om mdat alle v  vertices evenredig ve erlicht wordden door
    deze
       elfde kleur licht. Hierdoo lijkt een 3 object tw
                                or          3D          weedimensionaal te zijnn.




              Figuur 6 – Een bol
                   verlicht door
                  amb bient light

                                      Een 3D bol slechts v
                                        n                verlicht
                                      doo ambient light l
                                        or               lijkt
                                      twe
                                        eedimenssionaal te zijn.




    2
     D.H Eberly, 3D Game Eng
       H.          D         gine Design Amsterdam Morgan Kaufmann
                                       n,        m:
    publishers, 2007 p. 95.
                   7,
                    Saxion Hogeschool En
                                       nschede | D oorsprong van licht
                                                 De
9         namic Lighting
        Dyn



    1.3. Diffuse light
       .2      e
    Diffu
        use light, geebaseerd op de wet v
                                 p         van Lambert vertegenw
                                                      t,         woordigd directional
                                                                           d
    light en kan wo
        t           orden besch hreven als licht met ee positie in de ruimte komend
                                                      en         n         e
    vanu een enk
        uit         kele richting Een zakl
                                g.          lamp die scchuin boven een objeect wordt
    gehoouden, kan b beschouwd worden als een lichtbro die diffus light uitze
                                                      on         se         endt.

    In de onderstaa ande afbeelding zendt een lichtbron diffuse light met e een rode
    kleur uit op de linker kant van onze bo Wanneer het licht h oppervla van de
         r                                ol.        r         het         ak
    bol raakt, wordt het verstro
        r          t           ooid en weerkaatst het evenredig o
                                                                over dat opp
                                                                           pervlak.




                   Figuur 7 – Een bol
                    erlicht door rood
                   ve             r
                          diffuse li
                                   ight
                                           Diffuse light met een rod
                                                                   de
                                           kleur sc
                                                  chijnt op een zwaarte
                                           bol, waa
                                                  ardoor zi 3D vo
                                                           ijn     orm
                                           zichtbaa wordt.
                                                  ar       .


    De intensiteit van het wee   erkaatste liccht wordt bepaald door de cosinus van de
                                                                    r
    hoek tussen de normaal N van het o
        k           e                         oppervlak w
                                                        waar het lic
                                                                   cht op schijnt en de
    vecto D van de richting va het licht. Wanneer de hoek tussen N en D kleiner of
         or         e            an                      e                     k
                                              ende formule3:
    gelijk is aan π / 2. Dit leidt tot de volge
         k




    Voor directional lights is de D al beken Voor poi lights en spotlights kan de D
       r                        e          nd.      int
    berekend worde door (V – P) / | V – P |, waar P de locatie van de lich
                   en                                         e           htbron en
    P he te verlicht
       et          ten punt is.


    3
     D.H Eberly, 3D Game Eng
       H.          D          gine Design Amsterdam Morgan Kaufmann
                                        n,        m:
    publishers, 2007 p. 95,96.
                   7,
                    Saxion Hogeschool Ennschede | D oorsprong van licht
                                                  De
10      namic Lighting
      Dyn



        afbeeldingen hieronder demonstr
     De a                                reren hoe ambient ligght en diffu
                                                                        fuse light
        enwerken om zo een re
     same                    ealistischere weergave van object t creëren.
                                         e                     te




        Figuur 8 – Een bol
                     n                       Figuur 9 – Dezelfde
             verlicht d
                      door                     bol nu b
                                                      bovendien
              donkerr rood                  verlicht do
                                                      oor diffuse
            ambient l light                                  light




               Door combin
                   r        natie van ambient
                                    n
               en d
                  diffuse lig lijkt d bol ec
                            ght     de     cht
               3D te zijn.




     Het eerste figuur geeft on nze 3D bol weer waar donkerroo ambient light op
                                                      r          od
     schijnt. Het tweeede figuur is een weer
                                           rgave die ontstaan is u het eerst figuur,
                                                                 uit       te
     door lichtbron met diffuse light aan d linkerkan van de b te plaatsen. Ons
         r            m                    de         nt         bol
     object lijkt nu ec 3D te zij
                      cht        jn.




                       Saxion Hogeschool En
                                          nschede | D oorsprong van licht
                                                    De
11         namic Lighting
         Dyn



     1.3. Specula light
        .3      ar
     Net als diffuse light is spec
                      l          cular light e
                                             een vorm va directiona light. Het verschil
                                                        an          al          t
     tusse twee typ
          en         pen is dat sspecular ligh op een sc
                                             ht          cherpe en u
                                                                   uniforme ma anier van
     een oppervlak w weerkaatst. Specular lig vertegen
                                             ght         nwoordigd m andere woorden
                                                                    met
     de wweerkaatsing van licht o glimmend oppervlakken, terwij diffuse lig die op
                      g          op           de                    jl         ght
     matt oppervlak
         te           kken verteggenwoordigd De verto
                                              d.        olking van s
                                                                   specular ligh berust
                                                                                ht
     op d hoek tussen de kijker en de lic
         de                                  chtbron. Vanuit het ooogpunt van de kijker
     creëe specular light een sterk opge
          ert                                elicht gebie
                                                        ed, de speccular highlig
                                                                               ght of de
     speccular reflecti
                      ion, op het oppervlak v van het bek
                                                        keken objec De intens
                                                                   ct.          siteit van
     dit g
         gebied is afhhankelijk va het materiaal waarvan het obje gemaakt is en de
                                 an                                ect         t
     sterk
         kte van de lichtbron. Met de volg
                                  M          gende formule4 kan sp pecular light worden
                                                                                t
     berekend:




     De U kan berek kend worden door (V – E) / | V – E |, waar E het oogp
                                n                                       punt en P
     het t verlichten punt is. R is de reflectie vector.
         te         n

     In de onderstaa ande afbeel
                               lding vinden we onze bol waar nu naast am
                                          n                                mbient en
     diffuse light ook specular light op sc
                                          chijnt. Het is duidelijk te zien da de 3D
                                                                 k          at
     weer rgave van h object st
                    het        terk verbete is door de eigensch
                                          erd                     happen van specular
     light
         t.




                                          Het is evid
                                                    dent dat de 3D
                                          weergave van het object
                                          w                t
                                          st       beterd is.
                                           terk verb




     4
      D.H Eberly, 3D Game Eng
        H.          D         gine Design Amsterdam Morgan Kaufmann
                                        n,        m:
     publishers, 2007 p. 96.
                    7,
                     Saxion Hogeschool En
                                        nschede | D oorsprong van licht
                                                  De
12      namic Lighting
      Dyn



     1.3. Emissiv light
        .4      ve
     Emis
        ssive light verschilt va de hier
                                   an          rboven bespproken lichttypen. Dit type is
                                                                                t
     verantwoordelijk voor de e
                      k            eigenschap van het ma  ateriaal van de objecte om te
                                                                     n           en
                                     reflecteren of te abso
                                               n          orberen. Waanneer emisssive light
          Figuur 10 – Dezelfde bol wordt toe   egepast op het materi  iaal van ee object
                                                                                en
              met toeevoeging van
                    sppecular light simuleert het licht dat van het ob
                                                                     bject weerkaaatst.

     Zond der extra licchtbronnen heeft de k  kleur van eeen object mmet alleen emissive
     light dezelfde v
         t            visuele kwa aliteit als m
                                              met alleen ambient ligght. De rea actie van
     diffuse light of specular ligh op het op
                      s           ht          ppervlak van het object met alleen emissive
                                                         n
     light is echter anders. In de onderstaa
         t                        e           ande afbeeld
                                                         ding zien we een objec die een
                                                                     e         ct
     normmale groene kleur uitstr raalt.




                                    Het resultaa is gelijk aan dat w
                                    H           at                     wanneer er ambient
                                    light in plaa
                                    l           ats van em missive light zou zijn gebruikt,
                                                                        t
                                    totdat er ad
                                    t           dditionele ty
                                                            ypen licht wworden toegevoegd.
                                    De
                                    D ondersta  aande afbee elding laat d verschil duidelijk
                                                                        dit
                                    zien.
                                    z

         Figuur 11 – Een bol die
         F           E
            groen emisssive light
                       uitstraalt




     Zondder toevoeg ging van het groene emissive
     light zou de bol rood hebbe geleken. Wanneer
         t                       en
     de lichtstralen van de bron het opper
                     v           n          rvlak van
     de bol raken mengt zij      jn kleur, hhet rode
     ambient en diff fuse light en het witte specular
                                 n
     light zich me de kleur van het groene
         t,         et                      t
     emisssive lightt, waardoo   or een g  geelachtig
     oppeervlak ontstaaat.

                                                            Figuur 12 - Dezelfde boll
                                                               met een lichtbron die
                                                                                   e
                                                            rood ambien light, rood
                                                                        nt         d
                                                                diffuse light and wit
                                                                                    t
                                                             specular li
                                                                       ight uitzendt.
                                                                                    .




                       Saxion Hogeschool En
                                          nschede | D oorsprong van licht
                                                    De
13       Dynamic Lighting



     1.4 Berekening van het licht op een willekeurig object
     Nu we alle drie de typen licht kunnen berekenen en we het effect van emissive
     light hebben gezien, kunnen we met de onderstaande formule5 de kleur van een
     willekeurig belicht object berekenen:




                                                                        °

                                                            °
                                                            °

               waarbij      de afstandsvermindering voor het ie licht is, berekend
               met de volgende formule:

                                                        ,
                                                                                     ,
                                               |       |            |            |
               waarbij P de positie van het licht is en V het te belichten punt. De
               coëfficiënten zijn I voor de intensiteit (meestal 1),                     voor de

               constante    term,       voor   de   lineaire    term        en           voor   de
               kwadratische term.

                  is de spot vermindering, die de waarde 1 heeft voor point en
               directional lights, maar voor spotlights berekend moet worden met
               de formule:

                                    ·
                                                        ,       ·            cos
                                        0,
               met hoek θ (0, π / 2) gemeten tussen de as A en de muur van de
               kegel. D = (V – P) / | V – P |, waarbij P de locatie van de
               lichtbron en P het te verlichten punt is.




     5
      D.H. Eberly, 3D Game Engine Design, Amsterdam: Morgan Kaufmann
     publishers, 2007, p. 98.
                     Saxion Hogeschool Enschede | De oorsprong van licht
14    Dynamic Lighting



        2.      LICHT IN OPENGL
     In de volgende paragrafen wordt uiteengezet hoe OpenGL gebruik maakt van
     polygoon shading om licht te simuleren en hoe eigenschappen van lichtbronnen
     en materialen kunnen worden beïnvloed.

     2.1 Lighting en shading models
     2.1.1 Object shading
     OpenGL baseert zijn lichtmodel op de Gourad Shading implementatie. Elke
     vertex in een polygoon krijgt een specifieke kleur toegewezen. Deze kleur wordt
     berekend aan de hand van de eigenschappen van het materiaal van het object
     en de omringende lichtbronnen. Daarna worden de kleuren van elke vertex over
     de hele polygoon geïnterpoleerd.

     2.1.2 Light Models
     OpenGL      heeft   twee    belangrijke  functies, “glEnable(param)”    en
     “glDisable(param)”, waarmee vele features van OpenGL in- en uitgeschakeld
     kunnen worden. Om licht toe te voegen in een OpenGL applicatie moet men de
     volgende stappen uitvoeren:

             Schakel het verlichtingssysteem aan

             Stel de lichtmodellen in

             Stel de shading modellen in

     De eerste stap is eenvoudig en wordt uitgevoerd met de volgende regel:

     glEnable(GL_LIGHTING);

     De tweede stap, het instellen van het lichtmodel, wordt later behandeld. De
     derde stap, het instellen van het shading model, wordt uitgevoerd met een
     aanroep van de functie glShadeModel en kan twee instellingen hebben:

             SMOOTH, waarbij gebruik wordt gemaakt van Gourad shading.

             FLAT, waarbij de polygonen slechts een kleur hebben en er dus minder
             realistisch uitzien.

     OpenGL heeft een aantal functies voor het initialisatie gedeelte van een
     applicatie om specifieke globale eigenschappen in te stellen voor het gedrag van
     de applicatie. Het visuele gedrag van het lichtmodel wordt gespecificeerd door
     een aanroep van de functie “glLightModel”. Er zijn twee typen van deze functies:

             glLightModelf(GLenum pname, GLfloat param)

             glLightModelfv(GLenum pname, const GLfloat *params)

     Deze gebruiken respectievelijk scalaire en vector waarden als parameters.




                              Saxion Hogeschool Enschede | Licht in OpenGL
15    Dynamic Lighting



     2.1.3 Global ambient light model
     Naast het instellen van de hoeveelheid ambient light van een lichtbron of
     materiaal is het mogelijk om deze hoeveelheid globaal in te stellen door het
     toevoegen van een Global Ambient Light, zodat het op alle objecten in het
     systeem wordt toegepast. Dit lichtmodel kan worden toegevoegd met een
     aanroep van de functie “glLightModelfv”. Eerst specificeren we de kleur van de
     Global Ambient Light in met:


           Glfloat global_ambient[] = { 0.5f, 0.5f, 0.5f, 1.0f };
           // R=0.5, G=0.5, B=0.5, ALFA=1.0.
           // DE STANDAARD INTENSITEIT VAN GLOBAL AMBIENT LIGHT
           IS R=0.2, G=0.2, B=0.2, ALFA=1.0.


     vervolgens vertellen we OpenGL dat we een Global Ambient Light instellen en
     geven we de hierboven gespecificeerde kleur mee:


           glLightModelfv(GL_LIGHT_MODEL_AMBIENT, global_ambient);


     Normaalgesproken gebeurt dit in het initialisatie gedeelte van een applicatie. De
     alfa parameter wordt gebruikt om de doorzichtigheids factor van een object te
     definiëren en kan worden gebruikt om doorzichtig materiaal, zoals glas, te
     simuleren.

     2.1.4 Smooth shading
     De volgende stap is het opzetten van het shading model wat gebeurt door het
     aanroepen van de functie glShadeModel. Aangezien we gebruik willen maken van
     het smooth shading model doen we de volgende aanroep:


           glShadeModel(GL_SMOOTH);


     Na deze aanroep wordt voor alle polygonen gebruik gemaakt van Gourad-
     shading, waarbij de “vermindering” exact berekend wordt voor de vertices en
     deze waarden over de hele polygoon geïnterpoleerd worden.

     Naast Gourad-shading is er nog een andere shading techniek, Phong-shading,
     waar ik niet verder op in zal gaan. Phong-shading geeft realistischere beelden,
     maar door zijn tijdrovende berekeningen wordt vaak de voorkeur gegeven aan
     Gourad-shading.




                            Saxion Hogeschool Enschede | Licht in OpenGL
16    Dynamic Lighting



     2.1.5 Lichttypen
     Lichtbron en oppervlakmateriaal

     Theoretisch gezien zijn er twee typen lichteigenschappen te beschouwen
     wanneer men het lichtmodel gaat implementeren in OpenGL. Het eerste type
     beschrijft de eigenschappen van de lichtbron en de tweede de eigenschappen
     van het licht dat door het materiaal van het oppervlak van een object wordt
     gereflecteerd. Voor beiden moet de kleur van het licht worden ingesteld.

     De kleur van elke lichtbron wordt gekarakteriseerd door de kleur, in RGBA
     formaat, die het uitzendt en kan worden ingesteld door een aanroep van de
     functie “glLight”. De eigenschappen van het materiaal worden ingesteld door een
     aanroep van de functie “glMaterial” en worden gekarakteriseerd door de
     hoeveelheid licht dat het materiaal weerkaatst, eveneens in RGBA kleur formaat.

     2.1.5.1 Definiëring van een lichtbron
     OpenGL staat het gebruik van maximaal acht lichtbronnen tegelijkertijd in een
     scene toe. Elk van deze lichtbronnen kan in- of uitgeschakeld zijn; ze zijn initieel
     uitgeschakeld en worden ingeschakeld door een aanroep van de functie
     “glEnable”, waarbij als parameter “GL_LIGHTn” meegegeven wordt, waar n het
     nummer van het licht identificeert (de waarde van n kan variëren van 0 t/m 7).

     OpenGL heeft een aantal basis functies om een lichtbron te definiëren. Voor elk
     abstracte type licht dat OpenGL kent, heeft het een model gedefinieerd:
     GL_AMBIENT, GL_DIFFUSE, GL_SPECULAR en GL_EMISSIVE.

     Voor elke lichtbron moet de “glLightfv” functie worden aangeroepen. Zo kan
     bijvoorbeeld een specular light component aan een lichtbron toe worden
     gevoegd:


            GLfloat specular[] = {1.0f, 1.0f, 1.0f , 1.0f};

            glLightfv(GL_LIGHT0, GL_SPECULAR, specular);



     Op eenzelfde wijze kunnen andere componenten van abstracte typen licht
     worden toegevoegd aan een lichtbron.

     Daarnaast moet de positie van de lichtbron worden gespecificeerd. Dit gebeurt
     eveneens met de glLight functie en wel op de volgende manier:




            Glfloat position[] = { -1.5f, 1.0f, -4.0f, 1.0f };

            GlLightfv(GL_LIGHT0, GL_POSITION, position);




                             Saxion Hogeschool Enschede | Licht in OpenGL
17    Dynamic Lighting



     2.1.5.2 In- en uitschakeling van een lichtbron
     Tenslotte moet het gecreëerde licht worden ingeschakeld:


           glEnable(GL_LIGHT0);



     Zoals gezegd zijn alle acht ter beschikking staande lichtbronnen standaard
     uitgeschakeld. Wanneer men een lichtbron manueel wil uitschakelen, maakt men
     gebruik van de “glDisable” functie:




          glDisable(GL_LIGHT0);




                           Saxion Hogeschool Enschede | Licht in OpenGL
18    Dynamic Lighting



     2.1.5.3 Het definiëren van oppervlakmateriaal
     In werkelijkheid worden objecten opgelicht door de zon, waardoor ze licht met
     een witte intensiteit uitstralen. Zoals we weten, is de kleur wit een combinatie
     van alle kleuren. Wanneer het witte licht het oppervlak van een object raakt,
     worden sommige golflengtes van licht weerkaatst en anderen geabsorbeerd. Het
     licht dat wordt weerkaatst bepaald de kleur van het object waar men naar kijkt.
     Verschillende objecten zijn gemaakt van verschillend materiaal, wat de manier
     van reflectie beïnvloedt. Een rood voorwerp weerkaatst bijvoorbeeld alleen de
     rode deeltjes van licht en absorbeert alle andere kleuren. Wanneer er wit licht op
     objecten schijnt, ziet men hun “natuurlijke” kleur. Het witte licht bevat immers
     alle kleuren, zodat het object altijd een kleur heeft om te reflecteren. Wanneer
     het rode voorwerp echter alleen door een blauwe lamp wordt verlicht, lijkt hij
     zwart te zijn, omdat er geen rode kleur is om te weerkaatsen.

     Wanneer men in OpenGL een eigenschap van een materiaal toewijst aan een
     object wijst men theoretisch gezien de kleur toe die het object reflecteert. Als
     men een kleur aan een object toewijst door middel van de “glColor” functie, wijst
     men eigenlijk de eigenschap toe die de kleur van het object beschrijft; deze
     kleur zal dus niet reageren op licht. Dit is het verschil tussen het toewijzen van
     een kleur aan een object en het toewijzen van een materiaaleigenschap aan een
     object.

     Het is belangrijk te beseffen dat bij het inschakelen van de verlichten
     (“glEnable(GL_LIGHTING)”)    eigenlijk van   men    verwacht  wordt    om
     materiaaleigenschappen toe te wijzen door een aanroep van de “glMaterialfv”
     functie:


            float mcolor[] = { 1.0f, 0.0f, 0.0f, 1.0f };

            glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, mcolor);

            // WANNEER MEN NU EEN POLYGOON TEKENT WORDEN ZIJN
            MATERIAALEIGENSCHAPPEN BEÏNVLOED.




                            Saxion Hogeschool Enschede | Licht in OpenGL
19    Dyn
        namic Lighting



     2.1.5.4 Polygo winding
                  on
     De e
        eerste param meter (GL__FRONT) van de functie glMateria     alfv, zoals h
                                                                                hierboven
     besc
        chreven, bepaald welk vlak van de polygoo het licht wat door “mcolor”
                                                       on
     gesp
        pecificeerd is zou moe
                    i          eten weerka aatsen. Klaa arblijkelijk zijn er echhter twee
     kanten van een polygoon, namelijk de voor- en de achterka
                   n                       e                         ant. Welke kant van
     onze polygoon i nu de voor- (GL_FRONT) en we
        e            is                                 elke de achterkant (GL  L_BACK)?
     Dat is eenvoudig. Er zijn tw
                                wee manieren om een polygoon te specificere in een
                                                                     e          en
     3D r
        ruimte. Het met-de-klo ok-mee en t tegen-de-klok-in specif   ficeren van vertices.
     De richting waa
        r           arin je de vertices spec           epaalde welk kant de voor- en
                                           cificeert, be             ke
     welk kant de achterkant is
        ke                      s.

     Met de functie “
                    “glFrontFace is het mogelijk om de regels v
                               e”                             voor dit zogenaamde
         gon winding mechanism te specif
     polyg         g           me        ficeren:


      glF
        FrontFace( GL_CCW);

      // D
         DIT IS DE STANDAARD INSTELLING TEGEN D KLOK IN
                   S                  G:      DE



     De o
        onderstaande afbeelding verduidelij het princ
                              g           jkt       cipe van pol
                                                               lygon windin
                                                                          ng.




     Figuu 13 – Polygon winding
         ur

     Om een polygoo tegen-de
                     on          e-klok-in te definiëren, zoals in voorbeeld A te zien is,
     speccificeert men eerst vert
                     n            tex v0, waaarna men v vervolgt met het definiëren van
                                                                     t
     zijn basis door v1 te specif ficeren en e
                                             eindigt met de specificaatie van de top: v2.
     Met deze config guratie kijkt men tegen de voorka
                                 t            n          ant van de polygoon a aan, mits
     GL_CCCW is ingeesteld met d “glFrontFace” functie Als men d polygoon met-de-
                                 de                     e.          de         n
     klok--mee probe eert te speecificeren, zzoals in vooorbeeld B t zien is, wijst de
                                                                     te
     voorrkant van d polygoon weg van de kijker en zal men de polyg
                     de          n                                             goon niet
     kunnnen zien.




                             Sax
                               xion Hogeschool Ensche
                                                    ede | Licht in OpenGL
20    Dynamic Lighting



     2.1.5.5 Materiaal eigenschappen
     Om reflecterende materiaaleigenschappen in te stellen voor een oppervlak van
     een bepaald polygoon, moet de “glMaterial” functie vóór het definiëren van de
     vertices van de betreffende polygoon worden aangeroepen:


            // STEL DE REFLECTERENDE EIGENSCHAPPEN VAN HET MATERIAAL
            IN

            float colorGreen[] = { 0.0f, 1.0f, 0.0f, 1.0f };

            glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE,
            colorGreen);

            // TEKEN EEN POLYGOON WAAR OP DE INGESTELDE
            EIGENSCHAPPEN WORDEN TOEGEPAST

            glBegin(GL_TRIANGLES);

            glVertex3f(-1.0f, 0.0f, 0.0f);

            glVertex3f(0.0f, -1.0f, 0.0f);

            glVertex3f(1.0f, 0.0f, 0.0f);

            glEnd();


     Deze versie van de “glMaterial” functie, met het achtervoegsel “fv”, accepteert
     op      vectoren     gebaseerde     kleur    coördinaten.     De     parameter
     “GL_AMBIENT_AND_DIFFUSE” zorgt ervoor dat “colorGreen” op zowel ambient
     als diffuse light componenten van het materiaal wordt toegepast. Deze declaratie
     is handig, omdat aan de ambient en diffuse eigenschappen van materiaal in de
     meeste gevallen dezelfde kleur moet worden toegewezen.

     Deze procedure, wordt vervelend en onhandig wanneer men te maken heeft met
     een groot aantal polygonen. Een meer toegankelijke manier van definiëren is het
     zogenaamde color tracking. Hiermee is het mogelijk om materiaaleigenschappen
     te specificeren door enkel de “glColor” functie aan te roepen voor elk object
     waarvan men de materiaaleigenschappen wil specificeren. Om color tracking te
     gebruiken moet het eerst ingeschakeld worden, op de gebruikelijke wijze
     waarmee dat in OpenGL gebeurd: een aanroep van de “glEnable” functie:


             glEnable(GL_COLOR_MATERIAL);


     Vervolgens moet men de materiaaleigenschappen voordefiniëren, zodat ze aan
     objecten worden toegewezen wanneer de “glColor” functie wordt aangeroepen:


             glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);




                            Saxion Hogeschool Enschede | Licht in OpenGL
21    Dynamic Lighting



     Nu weet OpenGL dat elke keer wanneer de “glColor” functie wordt aangeroepen,
     voorafgaand aan het definiëren van (de vertices van) een polygoon, de ambient
     en diffuse eigenschappen worden toegewezen aan die polygoon.

     Resumerend moet men het volgende goed beseffen. De materiaaleigenschappen
     van het object specificeren het soort en de hoeveelheid licht dat door een object
     wordt gereflecteerd. De drie componenten van lichteigenschappen die zijn
     toegepast op het object om zijn uiterlijk te bepalen zijn:

            AMBIENT component
            DIFFUSE component
            SPECULAR component

     De componenten van de kleur van een materiaal worden ingesteld door een
     aanroep van de functie “glMaterial” op eenzelfde manier als het instellen van de
     kleur, door middel van het aanroepen van de “glColor” functie, van een
     polygoon. De “glMaterial” functie dient te worden aangeroepen voordat een
     vertex    van    een      polygoon     wordt     gespecificeerd,    zodat     de
     weerkaatsingeigenschappen van die vertex en alle hierop volgende vertices
     worden toegepast. Bovendien kan gebruik worden gemaakt van de functie
     “glColor” om materiaaleigenschappen te specificeren, mits color tracking is
     ingeschakeld.




                            Saxion Hogeschool Enschede | Licht in OpenGL
22    Dynamic Lighting



     2.1.5.6 Overige eigenschappen
     Het ambient component bepaalt de algehele kleur van het object en heeft het
     meeste effect wanneer een object niet wordt belicht. Het diffuse component is
     het meest belangrijk voor het bepalen van de kleur van een object wanneer er
     licht schijnt op zijn oppervlak. Voor “normale” verlichting is het verstandig om de
     ambient en diffuse componenten van het materiaal dezelfde waarden te geven,
     zoals hierboven in het voorbeeld is laten zien.

     Dan nu het specular component. Voor realistische verlichting door een
     theoretische lichtbron volstaat het in veel gevallen om alleen ambient en diffuse
     componenten te definiëren. Echter, wanneer men bijvoorbeeld een metalen
     object wil definiëren is het wenselijk om de reflectie van licht meer te
     benadrukken, zodat het object ook echt van metaal gemaakt lijkt te zijn.
     Hiervoor stelt OpenGL eigenschappen beschikbaar die onder te verdelen vallen in
     twee categorieën:

            SPECULAR component of SPECULAR REFLECTION component
            SHININESS component of SPECULAR EXPONENT component

     Het eerstgenoemde component bepaald het effect van het materiaal op het
     weerkaatste licht. Deze eigenschap maakt het oppervlak van het object glanzend
     en kan worden ingesteld via het “GL_SPECULAR” component het materiaal van
     een object.

     Het laatstgenoemde component voorziet in een uitbreiding van het
     eerstgenoemde, namelijk de mate van glans. Via het “GL_SHININESS”
     component van het materiaal van het object kan de grootte en helderheid van
     de specular reflection worden ingesteld. Dit is de zeer heldere witte plek die te
     zien is op objecten die gemaakt zijn van materiaal met een hoge glans. Om het
     specular component van een materiaal in te stellen, moet men dus beide
     subcomponenten definiëren. Een aandachtspunt hierbij is dat zowel het specular
     component van de lichtbron als dat van het materiaal van het object moet zijn
     ingesteld. Hieronder staat een voorbeeld van het instellen van het specular
     component van het materiaal:


       // STEL DE REFLECTERENDE EIGENSCHAPPEN VAN HET MATERIAAL
       IN

       float specReflection[] = { 0.8f, 0.8f, 0.8f, 1.0f };

       glMaterialfv(GL_FRONT, GL_SPECULAR, specReflection);

       // STEL DE “SHININESS” IN

       glMateriali(GL_FRONT, GL_SHININESS, 96);



     Bij de tweede aanroep wordt gebruik gemaakt van de versie van “glMaterial”
     met het achtervoegsel “i”, wat betekend dat we de factor instellen met een int
     waarde tussen de 1 en de 128 voor dof respectievelijk helder.

                             Saxion Hogeschool Enschede | Licht in OpenGL
23    Dyn
        namic Lighting



     2.2 Normaa bereke
              al     ening
     Er is nog een ander zeer belangrijk c
         s          a                     concept om te begrijpe en, wannee we het
                                                                            er
     hebbben over he programm
                    et         meren van licht in OpenGL. Zelfs als alle lichtbronnen
     op hhun plaats zijn gezet en alle ob bjecten preccies zo zijn gedefiniee
                                                                 n           erd zoals
     geweenst, is er nog een an nder aspect nodig om de bereken
                                          t                      ningen van het licht
     goed uitgevoerd te laten w
         d          d           worden. Het is hiervoo namelijk noodzakelij om de
                                           t         or                      jk
     richting waarin de zijden va de objec
                                an        cten “wijzen” te weten. Deze richting wordt
     de normaal genoemd.

     Elk v
         vlak of 3D oppervlak h
                              heeft een nnormaal. De eze normaal bepaald de reactie
                                                                  l
     van het vlak o verlichtin in een 3 scene. De normaa is een ve
                   op         ng          3D                     al           ector die
                                       loo
                                         odrecht op het vlak sta en daar
                                                                 aat          rvan weg
                                       wijjst. Als een lichtbron p
                                                                 parallel loop met de
                                                                             pt
                                       normaal van een vlak is het opper
                                                                 s            rvlak het
                                       meeest helder en vice verssa.

                                         Om de normalen te berek
                                           m                     kenen hebben we de
                                         x e y coördi
                                            en         inaten van drie vertice nodig.
                                                                             es
                                         Vo
                                          oor vlakken bestaande uit meer dan drie
                                         vertices kieze we willekeurig drie vertices
                                                      en
                                         uit Zo zoude we bij berekening van de
                                           t.         en
                                         normaal van h onderste figuur A,B,C
                                                      het        e


               Figuur 14 – Normaa (a)
                    r           al




                                        kunnen gebruik  ken, maar oook A,B,D o B,C,D.
                                                                             of
                                        De berekening van de no   ormaal van een vlak
                                           taat uit drie stappen:
                                        best           e

                                               Eerst     moeten    we    de    vectoren
                                        bereekenen, die in de afbeeeldingen in het rood
                                        zijn aangegeve en
                                               Vervolge ens berekenen we hie  eruit het
                                        uitw
                                           wendig product (kruisprroduct).
                                               Ten slo otte moeten we deze vector
                                                                              e
                                        normmaliseren.
             Figuur 1 – Normaal (b)
                    15




                            Sax
                              xion Hogeschool Ensche
                                                   ede | Licht in OpenGL
24    Dynamic Lighting



     2.2.1 Berekening van de vectoren
     Een vector is de beweging van een punt naar een ander punt. Om de vector te
     krijgen van vertex A en B trekken we de x, y en z coördinaten van deze vertices
     van elkaar af. Het is hierbij van groot belang dat de punten tegen-de-klok-in zijn
     gedefinieerd. De eerste vector is van vertex A tot het eerste punt dat we tegen
     komen, punt B. De tweede vector is van punt A tot het tweede punt dat we
     tegen komen, punt C. Hieruit volgt:




                Vector 1 = Vertex B – Vertex A
                Vector 2 = Vertex C – Vertex A




                            Saxion Hogeschool Enschede | Licht in OpenGL
25    Dyn
        namic Lighting



     2.2. Bereke
        .2     ening van het uitwe
                                 endig prod
                                          duct
     Verv
        volgens moe
                  eten we he uitwendig product b
                           et        g         berekenen van deze vectoren,
                                                                    v
                                             zod
                                               dat we een punt krij  jgen dat
                                             loo
                                               odrecht op het vlak in kwestie
                                                                    n
                                             sta
                                               aat.

                                                  Vo
                                                   oor onze normaal heb    bben we
                                                  een x,y,z vec ctor nodig. Voor al
                                                  deze drie de coördinaten moeten
                                                                          n
                                                  we een berek
                                                   e           kening uitvo
                                                                          oeren om
                                                  de waarde van x, y en z voor de
                                                  potentiële nor
                                                               rmaal te ver
                                                                          rkrijgen.

                                                  Figu
                                                     uur 16 – Uitw
                                                                 wendig produc
                                                                             ct




     Dit b
         bereiken we door de onderstaande berekening uit te voeren.
                                                   g




        Normaal.x = (Vector1 × Vector2.z) – (V
        N                  1.y               Vector1.z × Vector2.y
                                                                 y)
        Normaal.y = (Vector1 × Vecto
        N                  1.z     or2.x) – (V
                                             Vector1.x × Vector2.z
                                                                 z)
        Normaal.z = (Vector1 × Vecto
        N                  1.x     or2.y) – (V
                                             Vector1.y × Vector2.x
                                                                 x)




     Let o Dit is no niet per definitie de normaal wa naar we op zoek zijn.
         op!       og                               aar




                           Sax
                             xion Hogeschool Ensche
                                                  ede | Licht in OpenGL
26    Dynamic Lighting



     2.2.3 Normaliseren van de normaal
     OpenGL gebruikt de lengte van de normaal om de helderheid van het object te
     bepalen. Dit levert problemen op, aangezien niet alle vlakken even groot zijn en
     kleinere objecten dus donkerder worden weergegeven dan grotere objecten.
     Omwille hiervan moet men de normaal normaliseren. Men moet met andere
     woorden de eenheidsvector berekenen van de normaal.




                               .                  .                  .

                         .               . ⁄
                         .               . ⁄
                         .               . ⁄




     Eerst berekenen we de normalisatie factor door gebruik te maken van de stelling
     van Pythagoras. We tellen de kwadraten van onze normaal coördinaten op en
     berekenen hieruit de vierkantswortel, de normalisatie factor. Wanneer we nu de
     gevonden coördinaten delen door de normalisatie factor, de lengte van de
     normaal, hebben we de coördinaten van de eenheidsvector berekend, die tussen
     -1 en 1 liggen.




                             Saxion Hogeschool Enschede | Licht in OpenGL

More Related Content

More from Jeroen Rosenberg

More from Jeroen Rosenberg (7)

Apache Solr lessons learned
Apache Solr lessons learnedApache Solr lessons learned
Apache Solr lessons learned
 
CoffeeScript
CoffeeScriptCoffeeScript
CoffeeScript
 
Websocket on Rails
Websocket on RailsWebsocket on Rails
Websocket on Rails
 
Provisioning with Vagrant & Puppet
Provisioning with Vagrant & PuppetProvisioning with Vagrant & Puppet
Provisioning with Vagrant & Puppet
 
Spring AOP
Spring AOPSpring AOP
Spring AOP
 
Dynamic System Configuration using SOA
Dynamic System Configuration using SOADynamic System Configuration using SOA
Dynamic System Configuration using SOA
 
Git the fast version control system
Git the fast version control systemGit the fast version control system
Git the fast version control system
 

Dynamic Lighting with OpenGL

  • 1. Saxion Hogeschool Enschede D YNAMIC L IGHTING Implementatie in OpenGL In dit document wordt uiteengezet hoe dynamische verlichting met behulp van OpenGL kan worden gesimuleerd. Naast een uitgebreide introductie van het fenomeen “licht”, bevat dit verslag tevens een met wiskundige berekeningen onderbouwde handleiding voor toepassing van de materie in OpenGL in combinatie met c++. Jeroen Rosenberg 31-3-2008
  • 2. 1 Dynamic Lighting Voorwoord Dit document is geschreven in het kader van een studietaak voor het vak “computer graphics”, als onderdeel van het derde studiejaar van de opleiding Informatica aan de Saxion Hogeschool te Enschede. Het verslag voert ons terug naar de oorsprong van licht, waardoor het de lezer aan de nodige basiskennis in de rest van het document niet zal ontbreken. Vervolgens wordt uitgebreid aandacht besteed aan de mogelijkheden van OpenGL met betrekking tot het ontwerp van lichtmodellen. Na het lezen van dit document beschikt de lezer hopelijk over voldoende kennis om de beschreven theorie in praktijk te kunnen brengen. Saxion Hogeschool Enschede | De oorsprong van licht
  • 3. 2 Dynamic Lighting Inhoudsopgave 1. De oorsprong van licht ......................................................................... 3 1.1 Een stroom van deeltjes of een golf van energie ................................... 3 1.2 De kleur van licht ............................................................................. 4 1.3 Abstracte typen licht ......................................................................... 6 1.3.1 Ambient light ............................................................................. 8 1.3.2 Diffuse light ............................................................................... 9 1.3.3 Specular light ........................................................................... 11 1.3.4 Emissive light ........................................................................... 12 1.4 Berekening van het licht op een willekeurig object .............................. 13 2. Licht in OpenGL ................................................................................ 14 2.1 Lighting en shading models ............................................................. 14 2.1.1 Object shading ......................................................................... 14 2.1.2 Light Models............................................................................. 14 2.1.3 Global ambient light model ......................................................... 15 2.1.4 Smooth shading ....................................................................... 15 2.1.5 Lichttypen ............................................................................... 16 2.1.5.1 Definiëring van een lichtbron................................................. 16 2.1.5.2 In- en uitschakeling van een lichtbron .................................... 17 2.1.5.3 Het definiëren van oppervlakmateriaal.................................... 18 2.1.5.4 Polygon winding .................................................................. 19 2.1.5.5 Materiaal eigenschappen ...................................................... 20 2.1.5.6 Overige eigenschappen ........................................................ 22 2.2 Normaal berekening ....................................................................... 23 2.2.1 Berekening van de vectoren ....................................................... 24 2.2.2 Berekening van het uitwendig product ......................................... 25 2.2.3 Normaliseren van de normaal ..................................................... 26 Saxion Hogeschool Enschede | De oorsprong van licht
  • 4. 3 Dynamic Lighting 1. DE OORSPRONG VAN LICHT Licht is het belangrijkste aspect achter visuele representatie van elk willekeurig signaal dat een mens visueel waarneemt. Perceptie van licht vindt zijn oorsprong in het feit dat wat men kan zien niet gebaseerd is op de objecten die men bekijkt, maar op de reflectie van lichtstralen, die uitgezonden zijn vanuit een lichtbron, door deze objecten. Het is belangrijk om te beseffen dat onze ogen objecten niet direct zien, omdat hier tussen geen lichamelijke correlatie bestaat. Lichtstralen reizen theoretisch in een rechte lijn. Op het moment dat men een object visueel waarneemt, zijn het deze lichtstralen die door dat object gereflecteerd of verstrooid zijn. Bij het programmeren van een 3D licht engine, waarbij men gebruik maakt van de OpenGL lichtmodellering functies, is het belangrijk de volgende twee regels te begrijpen: Je ogen zijn mechanismen die gemaakt zijn om deeltjes van licht waar te nemen en niet de objecten zelf. Als een programmeur zul je deze werking op het computer scherm moeten simuleren. Een lichtstraal reist in een rechte lijn. 1.1 Een stroom van deeltjes of een golf van energie Het laatstgenoemde punt hoeft niet per definitie waar te zijn. Er zijn twee manieren om licht te beschouwen. Een theorie beschrijft het licht als een stroom van deeltjes. Een tweede theorie ziet licht als een golf van energie. De oude Grieken zagen licht als een stroom van deeltjes die reizen in een rechte lijn en tegen een muur kaatsen op dezelfde manier als andere fysieke objecten doen. Men kon het licht niet zien, omdat de deeltjes simpelweg te klein of te snel voor het oog waren. In de zeventiende eeuw werd voorgesteld dat licht een golf van energie was die niet exact in een rechte lijn reisde. Dit werd in het jaar 1807 bevestigd met een experiment dat demonstreerde dat het licht, wanneer het een smalle opening passeerde, extra licht uitstraalde aan de andere kant van de opening. Hierdoor was bewezen dat het licht zich in de vorm van een golf moest verplaatsen om zich op deze manier te spreiden. Albert Einstein ontwikkelde de theorie van licht verder in het jaar 1905. Hij sprak van het “foto-elektrische effect”, waarbij ultraviolet licht elektronen van het oppervlak dat het raakte uitstraalde. Deze theorie beschouwde licht als een stroom van energie pakketjes, de zogenaamde fotonen. Hieruit kunnen we concluderen dat licht zich zowel als een golf als pakketjes van energie deeltjes (fotonen) kan gedragen. Saxion Hogeschool Enschede | De oorsprong van licht
  • 5. 4 namic Lighting Dyn 1.2 De kleu van lic ur cht Het licht dat he menselijk oog kan zien bestaa in het alg et ke at gemeen uit een mix van allerlei soor rten licht ve erstrooid en weerkaatst tegen de o t omringende objecten met elk hun eigen materiaal eigensc chappen. Alle fysieke ddeeltjes bestaan uit atom men. De manier van ref flectie van f fotonen doo fysieke de or eeltjes hang o.a. af gt van het soort a atoom, het a aantal atommen van elk soort en de volgorde van de ke men in het object dat de fotone weerkaatst. Sommi atom t en ige fotonen worden n weerrkaatst en ssommige ge eabsorbeerd Dit conce bepaald de visuele kwaliteit d. ept van materiaal. De kleur lic cht die het materiaal w weerkaatst wordt gezie als de en kleur van dat materiaal. Des te me r eer licht erd door het mmateriaal weeerkaatst word des te m dt, meer het lijjkt te glimmen voor het h menselijk oog. Elke verschillende kle eur bestaaat eenvo oudigweg uitu enerrgie die weergegeve en kan worden door eeen golfle engte die zichtbaar is voor het oog. Een golfleng r E gte word gemeten tussen twe dt ee toppen of dalen van ee en enerrgiegolf. F Figuur 1 – Een golflengte w n wordt gemete tussen en twee toppen of dalen van een golf n n Saxion Hogeschool En nschede | D oorsprong van licht De
  • 6. 5 namic Lighting Dyn Het zzichtbare lic ligt tusse de golflengtes variërend van 39 nanometer (violet cht en 90 licht) tot 720 nanometer (rood licht Het segment van golflengtes die hier ) t). tusse liggen wo en ordt het kleurenspectru genoemd. um Figuur 2 – Het kleu urenspectrum m Bij het “pr j rogramm meren van n lic cht” hoev ven wij a alleen rekening t houden met te zic chtbaar llicht. Saxion Hogeschool En nschede | D oorsprong van licht De
  • 7. 6 namic Lighting Dyn 1.3 Abstrac typen licht cte n Om het effect vvan licht in OpenGL te begrijpen, is het goed om stil te staan bij de drie verschillende soorte lichtbronn en nen die Ope enGL onders scheidt: Directio onal lights, waarbij we ons voorstellen dat d lichtbron oneindig e de ver weg is, zodat de lichtstralen parallel aa elkaar lop e n an pen. Point lig ghts, waarb de lichtb bij catie heeft in de ruimte en licht bron een loc e in alle ric chtingen uitzendt. hts, waarbij de lichtbro eveneens een locatie heeft in de ruimte, Spotligh on s e e maar alle een licht uitzendt binne een kegel. en Figuu 3 – Directio ur onal light Figuu 4– Point lig ur ght Figuu 5 - Spotligh ur ht Saxion Hogeschool En nschede | D oorsprong van licht De
  • 8. 7 Dynamic Lighting Echte lichtbronnen zenden licht uit van area sources (bronnen die licht vanuit een bepaald gebied uitzenden) of volume sources (driedimensionale bronnen van uitzendend licht). Point lights zijn een redelijke benadering van werkelijke lichtbronnen, maar produceren niet altijd visueel correcte informatie. Zo hebben schaduwen die gegenereerd worden door point lights scherpe hoeken, terwijl schaduwen gegenereerd door echte lichtbronnen een vloeiende rand hebben.1 Voor het representeren van licht bij het programmeren zijn er een aantal abstracte termen die specifieke effecten van licht beschrijven samengevoegd tot abstracte typen licht. De terminologie van deze typen is essentieel voor een grafische programmeur. Deze set van effecten geeft bij langer na niet alle effecten die licht kan produceren weer, maar doet dienst als een redelijke benadering hiervan. Het is belangrijk om te begrijpen welk effect elk van deze abstracte typen licht hebben op het oppervlak van 3D objecten. De typen zijn bedacht omdat het noodzakelijk is dat bepaalde effecten van licht op objecten beschreven zijn om zo de ingewikkelde wiskundige berekeningen te distilleren. Dit betekent echter niet dat deze typen in werkelijkheid bestaan. Het zou erg tijdrovend zijn om de werkelijke mechaniek van licht te berekenen. Derhalve onderscheidt OpenGL de volgende soorten licht: Ambient light (omgevingslicht) Diffuse light (diffuus licht) Specular light (spiegelend licht) Daarnaast kent OpenGL emissive light (uitzendend licht). Deze wordt los gezien van de andere typen, omdat het licht beschrijft dat uitgezonden wordt door objecten, waar de andere drie typen licht beschrijven afkomstig van een lichtbron. Elke lichtbron in OpenGL heeft naast een positie en een richting verschillende additionele attributen. Elk licht kan monochroom zijn, een RGB kleur en zelfs meerdere kleuren bevatten om de bijdrage van ambient, diffuse en specular light te vertegenwoordigen. Ook kan voor deze kleuren de intensiteit worden ingesteld en heeft elk licht een flag om aan te geven of het licht aan of uit is. De overige attributen zijn afhankelijk van het type licht. In de volgende paragrafen worden de verschillende typen licht die OpenGL onderscheidt nader toegelicht. 1 D.H. Eberly, 3D Game Engine Design, Amsterdam: Morgan Kaufmann publishers, 2007, p. 92-94. Saxion Hogeschool Enschede | De oorsprong van licht
  • 9. 8 namic Lighting Dyn 1.3. Ambien light .1 nt Amb bient light is eigenlijk oo geen ech lichtbron maar het gemiddelde volume ok hte n, t e van licht dat wo ordt gecreëe door het uitzenden van licht door alle om erd mringende bronnen. Wanneer zon lichtb W nnestralen door het ra aam van e een kamer schijnen, raken ze de muur en worden ze gereflecte eerd en ve erstrooid in allerlei n verscchillende ric chtingen, wa aardoor de hele kamer verlicht wo r ordt. Dit effe wordt ect bereikt door de kleur van het ambient light te co h t ombineren m de kleu van de met ur ambient factor van het mat v teriaal: De vertegenwwoordigd de scalaire v e vermenigvuldiging waa armee het inwendig berekend2. product wordt b Door alleen gebruik te mak r ken van amb kan een 3D object niet compleet bient light k word den weerge egeven, om mdat alle v vertices evenredig ve erlicht wordden door deze elfde kleur licht. Hierdoo lijkt een 3 object tw or 3D weedimensionaal te zijnn. Figuur 6 – Een bol verlicht door amb bient light Een 3D bol slechts v n verlicht doo ambient light l or lijkt twe eedimenssionaal te zijn. 2 D.H Eberly, 3D Game Eng H. D gine Design Amsterdam Morgan Kaufmann n, m: publishers, 2007 p. 95. 7, Saxion Hogeschool En nschede | D oorsprong van licht De
  • 10. 9 namic Lighting Dyn 1.3. Diffuse light .2 e Diffu use light, geebaseerd op de wet v p van Lambert vertegenw t, woordigd directional d light en kan wo t orden besch hreven als licht met ee positie in de ruimte komend en n e vanu een enk uit kele richting Een zakl g. lamp die scchuin boven een objeect wordt gehoouden, kan b beschouwd worden als een lichtbro die diffus light uitze on se endt. In de onderstaa ande afbeelding zendt een lichtbron diffuse light met e een rode kleur uit op de linker kant van onze bo Wanneer het licht h oppervla van de r ol. r het ak bol raakt, wordt het verstro r t ooid en weerkaatst het evenredig o over dat opp pervlak. Figuur 7 – Een bol erlicht door rood ve r diffuse li ight Diffuse light met een rod de kleur sc chijnt op een zwaarte bol, waa ardoor zi 3D vo ijn orm zichtbaa wordt. ar . De intensiteit van het wee erkaatste liccht wordt bepaald door de cosinus van de r hoek tussen de normaal N van het o k e oppervlak w waar het lic cht op schijnt en de vecto D van de richting va het licht. Wanneer de hoek tussen N en D kleiner of or e an e k ende formule3: gelijk is aan π / 2. Dit leidt tot de volge k Voor directional lights is de D al beken Voor poi lights en spotlights kan de D r e nd. int berekend worde door (V – P) / | V – P |, waar P de locatie van de lich en e htbron en P he te verlicht et ten punt is. 3 D.H Eberly, 3D Game Eng H. D gine Design Amsterdam Morgan Kaufmann n, m: publishers, 2007 p. 95,96. 7, Saxion Hogeschool Ennschede | D oorsprong van licht De
  • 11. 10 namic Lighting Dyn afbeeldingen hieronder demonstr De a reren hoe ambient ligght en diffu fuse light enwerken om zo een re same ealistischere weergave van object t creëren. e te Figuur 8 – Een bol n Figuur 9 – Dezelfde verlicht d door bol nu b bovendien donkerr rood verlicht do oor diffuse ambient l light light Door combin r natie van ambient n en d diffuse lig lijkt d bol ec ght de cht 3D te zijn. Het eerste figuur geeft on nze 3D bol weer waar donkerroo ambient light op r od schijnt. Het tweeede figuur is een weer rgave die ontstaan is u het eerst figuur, uit te door lichtbron met diffuse light aan d linkerkan van de b te plaatsen. Ons r m de nt bol object lijkt nu ec 3D te zij cht jn. Saxion Hogeschool En nschede | D oorsprong van licht De
  • 12. 11 namic Lighting Dyn 1.3. Specula light .3 ar Net als diffuse light is spec l cular light e een vorm va directiona light. Het verschil an al t tusse twee typ en pen is dat sspecular ligh op een sc ht cherpe en u uniforme ma anier van een oppervlak w weerkaatst. Specular lig vertegen ght nwoordigd m andere woorden met de wweerkaatsing van licht o glimmend oppervlakken, terwij diffuse lig die op g op de jl ght matt oppervlak te kken verteggenwoordigd De verto d. olking van s specular ligh berust ht op d hoek tussen de kijker en de lic de chtbron. Vanuit het ooogpunt van de kijker creëe specular light een sterk opge ert elicht gebie ed, de speccular highlig ght of de speccular reflecti ion, op het oppervlak v van het bek keken objec De intens ct. siteit van dit g gebied is afhhankelijk va het materiaal waarvan het obje gemaakt is en de an ect t sterk kte van de lichtbron. Met de volg M gende formule4 kan sp pecular light worden t berekend: De U kan berek kend worden door (V – E) / | V – E |, waar E het oogp n punt en P het t verlichten punt is. R is de reflectie vector. te n In de onderstaa ande afbeel lding vinden we onze bol waar nu naast am n mbient en diffuse light ook specular light op sc chijnt. Het is duidelijk te zien da de 3D k at weer rgave van h object st het terk verbete is door de eigensch erd happen van specular light t. Het is evid dent dat de 3D weergave van het object w t st beterd is. terk verb 4 D.H Eberly, 3D Game Eng H. D gine Design Amsterdam Morgan Kaufmann n, m: publishers, 2007 p. 96. 7, Saxion Hogeschool En nschede | D oorsprong van licht De
  • 13. 12 namic Lighting Dyn 1.3. Emissiv light .4 ve Emis ssive light verschilt va de hier an rboven bespproken lichttypen. Dit type is t verantwoordelijk voor de e k eigenschap van het ma ateriaal van de objecte om te n en reflecteren of te abso n orberen. Waanneer emisssive light Figuur 10 – Dezelfde bol wordt toe egepast op het materi iaal van ee object en met toeevoeging van sppecular light simuleert het licht dat van het ob bject weerkaaatst. Zond der extra licchtbronnen heeft de k kleur van eeen object mmet alleen emissive light dezelfde v t visuele kwa aliteit als m met alleen ambient ligght. De rea actie van diffuse light of specular ligh op het op s ht ppervlak van het object met alleen emissive n light is echter anders. In de onderstaa t e ande afbeeld ding zien we een objec die een e ct normmale groene kleur uitstr raalt. Het resultaa is gelijk aan dat w H at wanneer er ambient light in plaa l ats van em missive light zou zijn gebruikt, t totdat er ad t dditionele ty ypen licht wworden toegevoegd. De D ondersta aande afbee elding laat d verschil duidelijk dit zien. z Figuur 11 – Een bol die F E groen emisssive light uitstraalt Zondder toevoeg ging van het groene emissive light zou de bol rood hebbe geleken. Wanneer t en de lichtstralen van de bron het opper v n rvlak van de bol raken mengt zij jn kleur, hhet rode ambient en diff fuse light en het witte specular n light zich me de kleur van het groene t, et t emisssive lightt, waardoo or een g geelachtig oppeervlak ontstaaat. Figuur 12 - Dezelfde boll met een lichtbron die e rood ambien light, rood nt d diffuse light and wit t specular li ight uitzendt. . Saxion Hogeschool En nschede | D oorsprong van licht De
  • 14. 13 Dynamic Lighting 1.4 Berekening van het licht op een willekeurig object Nu we alle drie de typen licht kunnen berekenen en we het effect van emissive light hebben gezien, kunnen we met de onderstaande formule5 de kleur van een willekeurig belicht object berekenen: ° ° ° waarbij de afstandsvermindering voor het ie licht is, berekend met de volgende formule: , , | | | | waarbij P de positie van het licht is en V het te belichten punt. De coëfficiënten zijn I voor de intensiteit (meestal 1), voor de constante term, voor de lineaire term en voor de kwadratische term. is de spot vermindering, die de waarde 1 heeft voor point en directional lights, maar voor spotlights berekend moet worden met de formule: · , · cos 0, met hoek θ (0, π / 2) gemeten tussen de as A en de muur van de kegel. D = (V – P) / | V – P |, waarbij P de locatie van de lichtbron en P het te verlichten punt is. 5 D.H. Eberly, 3D Game Engine Design, Amsterdam: Morgan Kaufmann publishers, 2007, p. 98. Saxion Hogeschool Enschede | De oorsprong van licht
  • 15. 14 Dynamic Lighting 2. LICHT IN OPENGL In de volgende paragrafen wordt uiteengezet hoe OpenGL gebruik maakt van polygoon shading om licht te simuleren en hoe eigenschappen van lichtbronnen en materialen kunnen worden beïnvloed. 2.1 Lighting en shading models 2.1.1 Object shading OpenGL baseert zijn lichtmodel op de Gourad Shading implementatie. Elke vertex in een polygoon krijgt een specifieke kleur toegewezen. Deze kleur wordt berekend aan de hand van de eigenschappen van het materiaal van het object en de omringende lichtbronnen. Daarna worden de kleuren van elke vertex over de hele polygoon geïnterpoleerd. 2.1.2 Light Models OpenGL heeft twee belangrijke functies, “glEnable(param)” en “glDisable(param)”, waarmee vele features van OpenGL in- en uitgeschakeld kunnen worden. Om licht toe te voegen in een OpenGL applicatie moet men de volgende stappen uitvoeren: Schakel het verlichtingssysteem aan Stel de lichtmodellen in Stel de shading modellen in De eerste stap is eenvoudig en wordt uitgevoerd met de volgende regel: glEnable(GL_LIGHTING); De tweede stap, het instellen van het lichtmodel, wordt later behandeld. De derde stap, het instellen van het shading model, wordt uitgevoerd met een aanroep van de functie glShadeModel en kan twee instellingen hebben: SMOOTH, waarbij gebruik wordt gemaakt van Gourad shading. FLAT, waarbij de polygonen slechts een kleur hebben en er dus minder realistisch uitzien. OpenGL heeft een aantal functies voor het initialisatie gedeelte van een applicatie om specifieke globale eigenschappen in te stellen voor het gedrag van de applicatie. Het visuele gedrag van het lichtmodel wordt gespecificeerd door een aanroep van de functie “glLightModel”. Er zijn twee typen van deze functies: glLightModelf(GLenum pname, GLfloat param) glLightModelfv(GLenum pname, const GLfloat *params) Deze gebruiken respectievelijk scalaire en vector waarden als parameters. Saxion Hogeschool Enschede | Licht in OpenGL
  • 16. 15 Dynamic Lighting 2.1.3 Global ambient light model Naast het instellen van de hoeveelheid ambient light van een lichtbron of materiaal is het mogelijk om deze hoeveelheid globaal in te stellen door het toevoegen van een Global Ambient Light, zodat het op alle objecten in het systeem wordt toegepast. Dit lichtmodel kan worden toegevoegd met een aanroep van de functie “glLightModelfv”. Eerst specificeren we de kleur van de Global Ambient Light in met: Glfloat global_ambient[] = { 0.5f, 0.5f, 0.5f, 1.0f }; // R=0.5, G=0.5, B=0.5, ALFA=1.0. // DE STANDAARD INTENSITEIT VAN GLOBAL AMBIENT LIGHT IS R=0.2, G=0.2, B=0.2, ALFA=1.0. vervolgens vertellen we OpenGL dat we een Global Ambient Light instellen en geven we de hierboven gespecificeerde kleur mee: glLightModelfv(GL_LIGHT_MODEL_AMBIENT, global_ambient); Normaalgesproken gebeurt dit in het initialisatie gedeelte van een applicatie. De alfa parameter wordt gebruikt om de doorzichtigheids factor van een object te definiëren en kan worden gebruikt om doorzichtig materiaal, zoals glas, te simuleren. 2.1.4 Smooth shading De volgende stap is het opzetten van het shading model wat gebeurt door het aanroepen van de functie glShadeModel. Aangezien we gebruik willen maken van het smooth shading model doen we de volgende aanroep: glShadeModel(GL_SMOOTH); Na deze aanroep wordt voor alle polygonen gebruik gemaakt van Gourad- shading, waarbij de “vermindering” exact berekend wordt voor de vertices en deze waarden over de hele polygoon geïnterpoleerd worden. Naast Gourad-shading is er nog een andere shading techniek, Phong-shading, waar ik niet verder op in zal gaan. Phong-shading geeft realistischere beelden, maar door zijn tijdrovende berekeningen wordt vaak de voorkeur gegeven aan Gourad-shading. Saxion Hogeschool Enschede | Licht in OpenGL
  • 17. 16 Dynamic Lighting 2.1.5 Lichttypen Lichtbron en oppervlakmateriaal Theoretisch gezien zijn er twee typen lichteigenschappen te beschouwen wanneer men het lichtmodel gaat implementeren in OpenGL. Het eerste type beschrijft de eigenschappen van de lichtbron en de tweede de eigenschappen van het licht dat door het materiaal van het oppervlak van een object wordt gereflecteerd. Voor beiden moet de kleur van het licht worden ingesteld. De kleur van elke lichtbron wordt gekarakteriseerd door de kleur, in RGBA formaat, die het uitzendt en kan worden ingesteld door een aanroep van de functie “glLight”. De eigenschappen van het materiaal worden ingesteld door een aanroep van de functie “glMaterial” en worden gekarakteriseerd door de hoeveelheid licht dat het materiaal weerkaatst, eveneens in RGBA kleur formaat. 2.1.5.1 Definiëring van een lichtbron OpenGL staat het gebruik van maximaal acht lichtbronnen tegelijkertijd in een scene toe. Elk van deze lichtbronnen kan in- of uitgeschakeld zijn; ze zijn initieel uitgeschakeld en worden ingeschakeld door een aanroep van de functie “glEnable”, waarbij als parameter “GL_LIGHTn” meegegeven wordt, waar n het nummer van het licht identificeert (de waarde van n kan variëren van 0 t/m 7). OpenGL heeft een aantal basis functies om een lichtbron te definiëren. Voor elk abstracte type licht dat OpenGL kent, heeft het een model gedefinieerd: GL_AMBIENT, GL_DIFFUSE, GL_SPECULAR en GL_EMISSIVE. Voor elke lichtbron moet de “glLightfv” functie worden aangeroepen. Zo kan bijvoorbeeld een specular light component aan een lichtbron toe worden gevoegd: GLfloat specular[] = {1.0f, 1.0f, 1.0f , 1.0f}; glLightfv(GL_LIGHT0, GL_SPECULAR, specular); Op eenzelfde wijze kunnen andere componenten van abstracte typen licht worden toegevoegd aan een lichtbron. Daarnaast moet de positie van de lichtbron worden gespecificeerd. Dit gebeurt eveneens met de glLight functie en wel op de volgende manier: Glfloat position[] = { -1.5f, 1.0f, -4.0f, 1.0f }; GlLightfv(GL_LIGHT0, GL_POSITION, position); Saxion Hogeschool Enschede | Licht in OpenGL
  • 18. 17 Dynamic Lighting 2.1.5.2 In- en uitschakeling van een lichtbron Tenslotte moet het gecreëerde licht worden ingeschakeld: glEnable(GL_LIGHT0); Zoals gezegd zijn alle acht ter beschikking staande lichtbronnen standaard uitgeschakeld. Wanneer men een lichtbron manueel wil uitschakelen, maakt men gebruik van de “glDisable” functie: glDisable(GL_LIGHT0); Saxion Hogeschool Enschede | Licht in OpenGL
  • 19. 18 Dynamic Lighting 2.1.5.3 Het definiëren van oppervlakmateriaal In werkelijkheid worden objecten opgelicht door de zon, waardoor ze licht met een witte intensiteit uitstralen. Zoals we weten, is de kleur wit een combinatie van alle kleuren. Wanneer het witte licht het oppervlak van een object raakt, worden sommige golflengtes van licht weerkaatst en anderen geabsorbeerd. Het licht dat wordt weerkaatst bepaald de kleur van het object waar men naar kijkt. Verschillende objecten zijn gemaakt van verschillend materiaal, wat de manier van reflectie beïnvloedt. Een rood voorwerp weerkaatst bijvoorbeeld alleen de rode deeltjes van licht en absorbeert alle andere kleuren. Wanneer er wit licht op objecten schijnt, ziet men hun “natuurlijke” kleur. Het witte licht bevat immers alle kleuren, zodat het object altijd een kleur heeft om te reflecteren. Wanneer het rode voorwerp echter alleen door een blauwe lamp wordt verlicht, lijkt hij zwart te zijn, omdat er geen rode kleur is om te weerkaatsen. Wanneer men in OpenGL een eigenschap van een materiaal toewijst aan een object wijst men theoretisch gezien de kleur toe die het object reflecteert. Als men een kleur aan een object toewijst door middel van de “glColor” functie, wijst men eigenlijk de eigenschap toe die de kleur van het object beschrijft; deze kleur zal dus niet reageren op licht. Dit is het verschil tussen het toewijzen van een kleur aan een object en het toewijzen van een materiaaleigenschap aan een object. Het is belangrijk te beseffen dat bij het inschakelen van de verlichten (“glEnable(GL_LIGHTING)”) eigenlijk van men verwacht wordt om materiaaleigenschappen toe te wijzen door een aanroep van de “glMaterialfv” functie: float mcolor[] = { 1.0f, 0.0f, 0.0f, 1.0f }; glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, mcolor); // WANNEER MEN NU EEN POLYGOON TEKENT WORDEN ZIJN MATERIAALEIGENSCHAPPEN BEÏNVLOED. Saxion Hogeschool Enschede | Licht in OpenGL
  • 20. 19 Dyn namic Lighting 2.1.5.4 Polygo winding on De e eerste param meter (GL__FRONT) van de functie glMateria alfv, zoals h hierboven besc chreven, bepaald welk vlak van de polygoo het licht wat door “mcolor” on gesp pecificeerd is zou moe i eten weerka aatsen. Klaa arblijkelijk zijn er echhter twee kanten van een polygoon, namelijk de voor- en de achterka n e ant. Welke kant van onze polygoon i nu de voor- (GL_FRONT) en we e is elke de achterkant (GL L_BACK)? Dat is eenvoudig. Er zijn tw wee manieren om een polygoon te specificere in een e en 3D r ruimte. Het met-de-klo ok-mee en t tegen-de-klok-in specif ficeren van vertices. De richting waa r arin je de vertices spec epaalde welk kant de voor- en cificeert, be ke welk kant de achterkant is ke s. Met de functie “ “glFrontFace is het mogelijk om de regels v e” voor dit zogenaamde gon winding mechanism te specif polyg g me ficeren: glF FrontFace( GL_CCW); // D DIT IS DE STANDAARD INSTELLING TEGEN D KLOK IN S G: DE De o onderstaande afbeelding verduidelij het princ g jkt cipe van pol lygon windin ng. Figuu 13 – Polygon winding ur Om een polygoo tegen-de on e-klok-in te definiëren, zoals in voorbeeld A te zien is, speccificeert men eerst vert n tex v0, waaarna men v vervolgt met het definiëren van t zijn basis door v1 te specif ficeren en e eindigt met de specificaatie van de top: v2. Met deze config guratie kijkt men tegen de voorka t n ant van de polygoon a aan, mits GL_CCCW is ingeesteld met d “glFrontFace” functie Als men d polygoon met-de- de e. de n klok--mee probe eert te speecificeren, zzoals in vooorbeeld B t zien is, wijst de te voorrkant van d polygoon weg van de kijker en zal men de polyg de n goon niet kunnnen zien. Sax xion Hogeschool Ensche ede | Licht in OpenGL
  • 21. 20 Dynamic Lighting 2.1.5.5 Materiaal eigenschappen Om reflecterende materiaaleigenschappen in te stellen voor een oppervlak van een bepaald polygoon, moet de “glMaterial” functie vóór het definiëren van de vertices van de betreffende polygoon worden aangeroepen: // STEL DE REFLECTERENDE EIGENSCHAPPEN VAN HET MATERIAAL IN float colorGreen[] = { 0.0f, 1.0f, 0.0f, 1.0f }; glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, colorGreen); // TEKEN EEN POLYGOON WAAR OP DE INGESTELDE EIGENSCHAPPEN WORDEN TOEGEPAST glBegin(GL_TRIANGLES); glVertex3f(-1.0f, 0.0f, 0.0f); glVertex3f(0.0f, -1.0f, 0.0f); glVertex3f(1.0f, 0.0f, 0.0f); glEnd(); Deze versie van de “glMaterial” functie, met het achtervoegsel “fv”, accepteert op vectoren gebaseerde kleur coördinaten. De parameter “GL_AMBIENT_AND_DIFFUSE” zorgt ervoor dat “colorGreen” op zowel ambient als diffuse light componenten van het materiaal wordt toegepast. Deze declaratie is handig, omdat aan de ambient en diffuse eigenschappen van materiaal in de meeste gevallen dezelfde kleur moet worden toegewezen. Deze procedure, wordt vervelend en onhandig wanneer men te maken heeft met een groot aantal polygonen. Een meer toegankelijke manier van definiëren is het zogenaamde color tracking. Hiermee is het mogelijk om materiaaleigenschappen te specificeren door enkel de “glColor” functie aan te roepen voor elk object waarvan men de materiaaleigenschappen wil specificeren. Om color tracking te gebruiken moet het eerst ingeschakeld worden, op de gebruikelijke wijze waarmee dat in OpenGL gebeurd: een aanroep van de “glEnable” functie: glEnable(GL_COLOR_MATERIAL); Vervolgens moet men de materiaaleigenschappen voordefiniëren, zodat ze aan objecten worden toegewezen wanneer de “glColor” functie wordt aangeroepen: glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE); Saxion Hogeschool Enschede | Licht in OpenGL
  • 22. 21 Dynamic Lighting Nu weet OpenGL dat elke keer wanneer de “glColor” functie wordt aangeroepen, voorafgaand aan het definiëren van (de vertices van) een polygoon, de ambient en diffuse eigenschappen worden toegewezen aan die polygoon. Resumerend moet men het volgende goed beseffen. De materiaaleigenschappen van het object specificeren het soort en de hoeveelheid licht dat door een object wordt gereflecteerd. De drie componenten van lichteigenschappen die zijn toegepast op het object om zijn uiterlijk te bepalen zijn: AMBIENT component DIFFUSE component SPECULAR component De componenten van de kleur van een materiaal worden ingesteld door een aanroep van de functie “glMaterial” op eenzelfde manier als het instellen van de kleur, door middel van het aanroepen van de “glColor” functie, van een polygoon. De “glMaterial” functie dient te worden aangeroepen voordat een vertex van een polygoon wordt gespecificeerd, zodat de weerkaatsingeigenschappen van die vertex en alle hierop volgende vertices worden toegepast. Bovendien kan gebruik worden gemaakt van de functie “glColor” om materiaaleigenschappen te specificeren, mits color tracking is ingeschakeld. Saxion Hogeschool Enschede | Licht in OpenGL
  • 23. 22 Dynamic Lighting 2.1.5.6 Overige eigenschappen Het ambient component bepaalt de algehele kleur van het object en heeft het meeste effect wanneer een object niet wordt belicht. Het diffuse component is het meest belangrijk voor het bepalen van de kleur van een object wanneer er licht schijnt op zijn oppervlak. Voor “normale” verlichting is het verstandig om de ambient en diffuse componenten van het materiaal dezelfde waarden te geven, zoals hierboven in het voorbeeld is laten zien. Dan nu het specular component. Voor realistische verlichting door een theoretische lichtbron volstaat het in veel gevallen om alleen ambient en diffuse componenten te definiëren. Echter, wanneer men bijvoorbeeld een metalen object wil definiëren is het wenselijk om de reflectie van licht meer te benadrukken, zodat het object ook echt van metaal gemaakt lijkt te zijn. Hiervoor stelt OpenGL eigenschappen beschikbaar die onder te verdelen vallen in twee categorieën: SPECULAR component of SPECULAR REFLECTION component SHININESS component of SPECULAR EXPONENT component Het eerstgenoemde component bepaald het effect van het materiaal op het weerkaatste licht. Deze eigenschap maakt het oppervlak van het object glanzend en kan worden ingesteld via het “GL_SPECULAR” component het materiaal van een object. Het laatstgenoemde component voorziet in een uitbreiding van het eerstgenoemde, namelijk de mate van glans. Via het “GL_SHININESS” component van het materiaal van het object kan de grootte en helderheid van de specular reflection worden ingesteld. Dit is de zeer heldere witte plek die te zien is op objecten die gemaakt zijn van materiaal met een hoge glans. Om het specular component van een materiaal in te stellen, moet men dus beide subcomponenten definiëren. Een aandachtspunt hierbij is dat zowel het specular component van de lichtbron als dat van het materiaal van het object moet zijn ingesteld. Hieronder staat een voorbeeld van het instellen van het specular component van het materiaal: // STEL DE REFLECTERENDE EIGENSCHAPPEN VAN HET MATERIAAL IN float specReflection[] = { 0.8f, 0.8f, 0.8f, 1.0f }; glMaterialfv(GL_FRONT, GL_SPECULAR, specReflection); // STEL DE “SHININESS” IN glMateriali(GL_FRONT, GL_SHININESS, 96); Bij de tweede aanroep wordt gebruik gemaakt van de versie van “glMaterial” met het achtervoegsel “i”, wat betekend dat we de factor instellen met een int waarde tussen de 1 en de 128 voor dof respectievelijk helder. Saxion Hogeschool Enschede | Licht in OpenGL
  • 24. 23 Dyn namic Lighting 2.2 Normaa bereke al ening Er is nog een ander zeer belangrijk c s a concept om te begrijpe en, wannee we het er hebbben over he programm et meren van licht in OpenGL. Zelfs als alle lichtbronnen op hhun plaats zijn gezet en alle ob bjecten preccies zo zijn gedefiniee n erd zoals geweenst, is er nog een an nder aspect nodig om de bereken t ningen van het licht goed uitgevoerd te laten w d d worden. Het is hiervoo namelijk noodzakelij om de t or jk richting waarin de zijden va de objec an cten “wijzen” te weten. Deze richting wordt de normaal genoemd. Elk v vlak of 3D oppervlak h heeft een nnormaal. De eze normaal bepaald de reactie l van het vlak o verlichtin in een 3 scene. De normaa is een ve op ng 3D al ector die loo odrecht op het vlak sta en daar aat rvan weg wijjst. Als een lichtbron p parallel loop met de pt normaal van een vlak is het opper s rvlak het meeest helder en vice verssa. Om de normalen te berek m kenen hebben we de x e y coördi en inaten van drie vertice nodig. es Vo oor vlakken bestaande uit meer dan drie vertices kieze we willekeurig drie vertices en uit Zo zoude we bij berekening van de t. en normaal van h onderste figuur A,B,C het e Figuur 14 – Normaa (a) r al kunnen gebruik ken, maar oook A,B,D o B,C,D. of De berekening van de no ormaal van een vlak taat uit drie stappen: best e Eerst moeten we de vectoren bereekenen, die in de afbeeeldingen in het rood zijn aangegeve en Vervolge ens berekenen we hie eruit het uitw wendig product (kruisprroduct). Ten slo otte moeten we deze vector e normmaliseren. Figuur 1 – Normaal (b) 15 Sax xion Hogeschool Ensche ede | Licht in OpenGL
  • 25. 24 Dynamic Lighting 2.2.1 Berekening van de vectoren Een vector is de beweging van een punt naar een ander punt. Om de vector te krijgen van vertex A en B trekken we de x, y en z coördinaten van deze vertices van elkaar af. Het is hierbij van groot belang dat de punten tegen-de-klok-in zijn gedefinieerd. De eerste vector is van vertex A tot het eerste punt dat we tegen komen, punt B. De tweede vector is van punt A tot het tweede punt dat we tegen komen, punt C. Hieruit volgt: Vector 1 = Vertex B – Vertex A Vector 2 = Vertex C – Vertex A Saxion Hogeschool Enschede | Licht in OpenGL
  • 26. 25 Dyn namic Lighting 2.2. Bereke .2 ening van het uitwe endig prod duct Verv volgens moe eten we he uitwendig product b et g berekenen van deze vectoren, v zod dat we een punt krij jgen dat loo odrecht op het vlak in kwestie n sta aat. Vo oor onze normaal heb bben we een x,y,z vec ctor nodig. Voor al deze drie de coördinaten moeten n we een berek e kening uitvo oeren om de waarde van x, y en z voor de potentiële nor rmaal te ver rkrijgen. Figu uur 16 – Uitw wendig produc ct Dit b bereiken we door de onderstaande berekening uit te voeren. g Normaal.x = (Vector1 × Vector2.z) – (V N 1.y Vector1.z × Vector2.y y) Normaal.y = (Vector1 × Vecto N 1.z or2.x) – (V Vector1.x × Vector2.z z) Normaal.z = (Vector1 × Vecto N 1.x or2.y) – (V Vector1.y × Vector2.x x) Let o Dit is no niet per definitie de normaal wa naar we op zoek zijn. op! og aar Sax xion Hogeschool Ensche ede | Licht in OpenGL
  • 27. 26 Dynamic Lighting 2.2.3 Normaliseren van de normaal OpenGL gebruikt de lengte van de normaal om de helderheid van het object te bepalen. Dit levert problemen op, aangezien niet alle vlakken even groot zijn en kleinere objecten dus donkerder worden weergegeven dan grotere objecten. Omwille hiervan moet men de normaal normaliseren. Men moet met andere woorden de eenheidsvector berekenen van de normaal. . . . . . ⁄ . . ⁄ . . ⁄ Eerst berekenen we de normalisatie factor door gebruik te maken van de stelling van Pythagoras. We tellen de kwadraten van onze normaal coördinaten op en berekenen hieruit de vierkantswortel, de normalisatie factor. Wanneer we nu de gevonden coördinaten delen door de normalisatie factor, de lengte van de normaal, hebben we de coördinaten van de eenheidsvector berekend, die tussen -1 en 1 liggen. Saxion Hogeschool Enschede | Licht in OpenGL