Successfully reported this slideshow.

Dynamic Lighting with OpenGL

1,642 views

Published on

Small paper about dynamic lighting using OpenGL

Published in: Technology, Art & Photos
  • Be the first to comment

  • Be the first to like this

Dynamic Lighting with OpenGL

  1. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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

×