Saxion Hogeschool Enschede
Jeroen Rosenberg
31-3-2008
DYNAMIC LIGHTING 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++.
Saxion Hogeschool Enschede | De oorsprong van licht
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.
4 Dyn
1.2Het van met atomvan atomweervan kleurwordte men
Elke bestaenerkan golflevoorwordtoppener
namic Light
De kleulicht dat heallerlei soorelk hun ei
men. De mahet soort a
men in het rkaatst en smateriaal. r van dat dt, des te m
glimmen selijk oog.
verschillaat eenvorgie die
worden engte die r het oog. Edt gemeten en of dal
rgiegolf.
Saxion Ho
ing
ur van licet menselijkrten licht vegen materinier van ref
atoom, het a object datsommige geDe kleur licmateriaal. meer het lij
voor h
ende kleoudigweg uweergegeve
door eezichtbaar
Een golfleng tussen tween van ee
geschool En
cht ke oog kan erstrooid en aal eigenscflectie van faantal atomt de fotoneeabsorbeerdcht die het Des te mejkt het
eur uit en en is
gte ee en
F
nschede | D
zien bestaa weerkaatstchappen. Alfotonen doo
men van elken weerkaad. Dit concemateriaal w
eer licht erd
Figuur 1 – Een
De oorspron
at in het algt tegen de ole fysieke d
or fysieke deke soort en tst. Sommi
ept bepaald weerkaatst door het m
n golflengte wtwee toppen
g van licht
gemeen uit omringende deeltjes beeeltjes hangde volgordige fotonen de visuele wordt gezie
materiaal we
wordt gemeten of dalen van
een mix objecten staan uit gt o.a. af e van de
n worden kwaliteit en als de eerkaatst
en tussen n een golf
5 Dyn
Het zlicht)tusse
Figuu
namic Light
zichtbare lic) tot 720 en liggen wo
r 2 – Het kleu
Saxion Ho
ing
cht ligt tussenanometer ordt het kle
urenspectrum
geschool En
en de golfle(rood lichturenspectru
Bijlicrezic
m
nschede | D
ngtes variët). Het segum genoem
j het “prcht” hoevkening tchtbaar l
De oorspron
rend van 39ment van d.
rogrammven wij ate houdelicht.
g van licht
90 nanometgolflengtes
meren vanalleen n met
er (violet die hier
n
6 Dyn
1.3Om de d
Figuu
Figuu
namic Light
Abstrachet effect vrie verschill
Directiover weg
Point ligin alle ric
Spotlighmaar alle
ur 3 – Directio
ur 5 - Spotligh
Saxion Ho
ing
cte typenvan licht in ende soorte
onal lights,is, zodat de
ghts, waarbchtingen uit
hts, waarbijeen licht uit
onal light
ht
geschool En
n licht OpenGL te
en lichtbronn
waarbij wee lichtstralen
bij de lichtbzendt.
de lichtbrozendt binne
Figuu
nschede | D
begrijpen, nen die Ope
e ons voorsn parallel aa
bron een loc
on eveneensen een kege
ur 4– Point lig
De oorspron
is het goedenGL onders
tellen dat dan elkaar lop
catie heeft i
s een locatiel.
ght
g van licht
om stil te scheidt:
de lichtbron pen.
n de ruimte
e heeft in de
staan bij
oneindig
e en licht
e ruimte,
Saxion Hogeschool Enschede | De oorsprong van licht
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.
8 Dyn
1.3.Ambvan lichtbrakeverscbereamb
De prod
Doorworddeze
2 D.Hpubl
namic Light
.1 Ambienbient light islicht dat wobronnen. Wn ze de chillende ricikt door de ient factor v
vertegenwuct wordt b
r alleen gebden weergeelfde kleur li
H. Eberly, 3Dishers, 2007
Figuur 6 veramb
Saxion Ho
ing
nt light eigenlijk ooordt gecreëe
Wanneer zonmuur en chtingen, wa kleur van hvan het mat
woordigd deberekend2.
ruik te makegeven, omcht. Hierdoo
D Game Eng7, p. 95.
– Een bollicht door
bient light
geschool En
ok geen echerd door hennestralen worden zeaardoor de het ambientteriaal:
e scalaire v
ken van ambmdat alle vor lijkt een 3
gine Design
Eendootwe
nschede | D
hte lichtbront uitzendendoor het ra gereflectehele kamert light te co
vermenigvu
bient light kvertices ev3D object tw
n, Amsterdam
n 3D bol or ambieeedimens
De oorspron
n, maar het van licht daam van eeerd en ver verlicht woombineren m
ldiging waa
kan een 3D enredig veweedimensi
m: Morgan
slechts vnt light lsionaal t
g van licht
t gemiddeldeoor alle om
een kamer erstrooid inordt. Dit effemet de kleu
armee het
object niet erlicht wordonaal te zijn
Kaufmann
verlicht lijkt e zijn.
e volume mringende
schijnen, n allerlei ect wordt ur van de
inwendig
compleet den door n.
9 Dyn
1.3.Diffulight vanugeho
In dkleurbol r
De ihoekvectogelijk
VoorbereP he
3 D.Hpubl
namic Light
.2 Diffuseuse light, get en kan wouit een enkouden, kan b
e onderstaar uit op de raakt, wordt
ntensiteit vk tussen deor D van dek is aan π /
r directional kend worde
et te verlicht
H. Eberly, 3Dishers, 2007
Five
Saxion Ho
ing
e light ebaseerd oporden beschkele richtingbeschouwd
ande afbeelinker kant t het verstro
an het weee normaal Ne richting va 2. Dit leidt
lights is deen door (V –ten punt is.
D Game Eng7, p. 95,96.
guur 7 – Eenerlicht door r
diffuse li
geschool En
p de wet vhreven als lg. Een zaklworden als
lding zendt van onze boooid en wee
erkaatste licN van het oan het licht. tot de volge
e D al beken– P) / | V –
gine Design
bol rood ight
nschede | D
van Lamberticht met eelamp die sc een lichtbro
een lichtbol. Wanneerrkaatst het
cht wordt boppervlak w Wanneer deende formu
nd. Voor poi– P |, waar P
n, Amsterdam
Diffuse kleur scbol, waazichtbaa
De oorspron
t, vertegenwen positie inchuin boveon die diffus
ron diffuse r het licht h evenredig o
epaald doorwaar het lice hoek tussle3:
int lights enP de locatie
m: Morgan
light mechijnt op ardoor ziar wordt.
g van licht
woordigd dn de ruimten een objese light uitze
light met ehet oppervlaover dat opp
r de cosinucht op schijen N en D k
spotlights e van de lich
Kaufmann
t een rod een zwaijn 3D vo.
directional e komend ect wordt endt.
een rode ak van de pervlak.
s van de nt en de kleiner of
kan de D htbron en
de arte orm
10 Dyn
De asame
Het schijdoorobje
F
namic Light
afbeeldingeenwerken o
eerste figunt. Het twe
r lichtbron mct lijkt nu ec
Dooren d3D t
iguur 8 – Eenverlicht ddonkerr
ambient l
Saxion Ho
ing
n hierondem zo een re
ur geeft oneede figuur met diffuse cht 3D te zij
r combindiffuse lige zijn.
n boldoorroodlight
geschool En
r demonstrealistischere
nze 3D bol is een weer light aan djn.
natie vanght lijkt d
nschede | D
reren hoe e weergave
weer waarrgave die ode linkerkan
n ambiende bol ec
Figuur 9 –bol nu b
verlicht do
De oorspron
ambient ligvan object t
r donkerroontstaan is unt van de b
t cht
– Dezelfdebovendienoor diffuse
light
g van licht
ght en diffute creëren.
od ambient uit het eerstbol te plaat
fuse light
light op te figuur, sen. Ons
11 Dyn
1.3.Net tusseeen de wmattop dcreëespecdit gsterkbere
De Uhet t
In ddiffuweerlight
4 D.Hpubl
namic Light
.3 Speculaals diffuse len twee typoppervlak w
weerkaatsingte oppervlakde hoek tusert specula
cular reflectigebied is afhkte van de kend:
U kan berekte verlichten
e onderstaase light oorgave van ht.
H. Eberly, 3Dishers, 2007
Saxion Ho
ing
ar light light is specpen is dat sweerkaatst. g van licht okken vertegsen de kijkr light een ion, op het hankelijk valichtbron. M
kend wordenn punt is. R
ande afbeelk specular
het object st
D Game Eng7, p. 96.
geschool En
cular light especular ligh Specular ligop glimmendgenwoordigder en de lic sterk opgeoppervlak v
an het mateMet de volg
n door (V – is de reflec
lding vinden light op scterk verbete
gine Design
Hwst
nschede | D
een vorm vaht op een scght vertegende oppervlad. De vertochtbron. Vaelicht gebievan het bekriaal waarvgende form
– E) / | V –tie vector.
n we onze chijnt. Het erd is door
n, Amsterdam
et is evidweergaveterk verb
De oorspron
an directionacherpe en unwoordigd mkken, terwij
olking van snuit het oo
ed, de speckeken objecan het objeule4 kan sp
– E |, waar
bol waar nis duidelijkde eigensch
m: Morgan
dent dat van het
beterd is
g van licht
al light. Hetuniforme mamet andere jl diffuse ligspecular lighogpunt van cular highligct. De intensect gemaaktpecular light
E het oogp
u naast amk te zien dahappen van
Kaufmann
de 3D t object .
t verschil anier van woorden
ght die op ht berust de kijker
ght of de siteit van t is en de t worden
punt en P
mbient en at de 3D specular
12 Dyn
1.3.Emisvera
Zondlight diffulight norm
Zondlight de lide amblightemisoppe
F
namic Light
.4 Emissivssive light ntwoordelijk
der extra lict dezelfde vse light of s
t is echter amale groene
der toevoegt zou de bol chtstralen vbol raken ient en diff
t, zich messive lightervlak ontsta
Figuur 10 – met toe
sp
Figuur 11 – Egroen emis
Saxion Ho
ing
ve light verschilt vak voor de e
chtbronnen visuele kwaspecular lighnders. In de kleur uitstr
HltDz
ging van h rood hebbevan de bronmengt zij
fuse light enet de kleut, waardooaat.
Dezelfde bolevoeging vanpecular light
Een bol diessive lightuitstraalt
geschool En
an de hiereigenschap
reflecterenwordt toesimuleert
heeft de kaliteit als mht op het ope onderstaaraalt.
Het resultaalight in plaatotdat er adDe onderstazien.
et groene en geleken. n het opperjn kleur, hn het witte r van het
or een g
nschede | D
rboven bespvan het man of te absoegepast op het licht da
kleur van emet alleen ppervlak vanande afbeeld
at is gelijk ats van emdditionele tyaande afbee
emissive Wanneer rvlak van het rode specular t groene geelachtig
De oorspron
proken lichateriaal vanorberen. Wa
het materit van het ob
een object mambient lig
n het object ding zien we
aan dat wmissive lightypen licht welding laat d
Figuur 12 - met een
rood ambiendiffuse
specular li
g van licht
ttypen. Ditn de objecteanneer emisiaal van eebject weerka
met alleen ght. De rea met alleen e een objec
wanneer er t zou zijn worden toedit verschil
Dezelfde bol lichtbron dient light, rood light and witight uitzendt.
t type is en om te ssive light en object aatst.
emissive actie van emissive ct die een
ambient gebruikt, gevoegd. duidelijk
ledt.
Saxion Hogeschool Enschede | De oorsprong van licht
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:
5 D.H. Eberly, 3D Game Engine Design, Amsterdam: Morgan Kaufmann publishers, 2007, p. 98.
°
° °
,
| | | | ,
·
, · cos0,
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:
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.
Saxion Hogeschool Enschede | Licht in OpenGL
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:
vervolgens vertellen we OpenGL dat we een Global Ambient Light instellen en geven we de hierboven gespecificeerde kleur mee:
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:
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.
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.
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, global_ambient);
glShadeModel(GL_SMOOTH);
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:
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 specular[] = {1.0f, 1.0f, 1.0f , 1.0f};
glLightfv(GL_LIGHT0, GL_SPECULAR, specular);
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:
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:
glEnable(GL_LIGHT0);
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.
19 Dyn
2.1.De ebescgespkantonzeDat 3D rDe rwelk
Met polyg
De o
Figuu
Om speczijn Met GL_Cklok-voorkunn
glF
// D
namic Light
5.4 Polygoeerste paramchreven, bepecificeerd ien van een
e polygoon iis eenvoudiruimte. Het richting waake kant de a
de functie “gon winding
onderstaand
ur 13 – Polyg
een polygoocificeert menbasis door deze config
CCW is inge-mee proberkant van dnen zien.
FrontFace(
DIT IS DE S
Sax
ing
on winding meter (GL_paald welk is zou moe
n polygoon, is nu de vog. Er zijn tw met-de-kloarin je de vchterkant is
“glFrontFaceg mechanism
e afbeelding
on winding
on tegen-den eerst vertv1 te specif
guratie kijktesteld met deert te spede polygoon
GL_CCW);
STANDAARD
xion Hogesc
_FRONT) va vlak van
eten weerka namelijk deor- (GL_FRwee manierok-mee en tertices specs.
e” is het mme te specif
g verduidelij
e-klok-in te tex v0, waaficeren en et men tegende “glFrontFecificeren, zn weg van
INSTELLING
hool Ensche
n de functide polygooaatsen. Klaae voor- en ONT) en ween om een tegen-de-klcificeert, be
ogelijk om ficeren:
jkt het princ
definiëren, arna men veindigt met n de voorkaace” functie
zoals in voo de kijker
G: TEGEN D
ede | Licht
e glMateriaon het licht arblijkelijk de achterkaelke de achpolygoon teok-in specif
epaalde welk
de regels v
cipe van pol
zoals in vovervolgt met de specificaant van de e. Als men dorbeeld B ten zal me
DE KLOK IN
in OpenGL
alfv, zoals h wat door zijn er echant. Welke terkant (GLe specificereficeren van ke kant de
voor dit zog
lygon windin
orbeeld A tt het definiatie van de polygoon ade polygoonte zien is, n de polyg
hierboven “mcolor”
hter twee kant van
L_BACK)? en in een vertices. voor- en
enaamde
ng.
e zien is, ëren van top: v2. aan, mits n met-de-
wijst de goon niet
Saxion Hogeschool Enschede | 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:
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:
Vervolgens moet men de materiaaleigenschappen voordefiniëren, zodat ze aan objecten worden toegewezen wanneer de “glColor” functie wordt 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();
glEnable(GL_COLOR_MATERIAL);
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:
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.
// 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);
23 Dyn
2.2Er ishebbop hgewegoedrichtde n
Elk vvan
namic Light
Normaas nog een aben over hehun plaats enst, is er d uitgevoerding waarin ormaal gen
vlak of 3D het vlak o
Figuur
Figuur 1
Sax
ing
al berekeander zeer et programmzijn gezet nog een and te laten wde zijden vaoemd.
oppervlak hop verlichtin
r 14 – Normaa
15 – Normaal
xion Hogesc
ening belangrijk c
meren van len alle ob
nder aspectworden. Hetan de objec
heeft een nng in een 3
loowijnome
Omx eVoveuitno
kunDe best
berezijn
uitw
norm
al (a)
(b)
hool Ensche
concept omicht in Ope
bjecten prect nodig om t is hiervoo
cten “wijzen
normaal. De3D scene. odrecht op jst. Als een rmaal van eest helder
m de normaen y coördi
oor vlakken rtices kiezet. Zo zoudermaal van h
nen gebruikberekening taat uit drie
Eerst ekenen, die aangegeve Vervolge
wendig prod Ten slo
maliseren.
ede | Licht
te begrijpenGL. Zelfs cies zo zijnde bereken
or namelijk ” te weten.
eze normaalDe normaahet vlak sta lichtbron peen vlak isen vice vers
len te berekinaten van bestaandeen we willeen we bij het onderste
ken, maar o van de no
e stappen:
moeten in de afbee
en ens berekeuct (kruispr
otte moete
in OpenGL
en, wanneeals alle lich
n gedefinieeningen van noodzakelij Deze richti
l bepaald dal is een veaat en daarparallel loops het oppersa.
kenen hebbdrie vertice uit meer keurig drieberekening
e figuur A,B
ook A,B,D oormaal van
we de eldingen in
nen we hieroduct). n we deze
er we het tbronnen erd zoals het licht jk om de ng wordt
e reactie ector die rvan weg pt met de rvlak het
en we de es nodig. dan drie vertices van de ,C
of B,C,D. een vlak
vectoren het rood
eruit het
e vector
Saxion Hogeschool Enschede | 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
25 Dyn
2.2.Verv
Dit b
Let o
NNN
namic Light
.2 Berekevolgens moe
bereiken we
op! Dit is no
Normaal.x Normaal.y Normaal.z
Sax
ing
ening van eten we he
door de on
og niet per
= (Vector1 = (Vector1= (Vector1
xion Hogesc
het uitweet uitwendig
derstaande
definitie de
1.y × Vect1.z × Vecto1.x × Vecto
hool Ensche
endig prodg product b
zodloosta
Voeedewede po
berekening
normaal wa
Figu
or2.z) – (Vor2.x) – (Vor2.y) – (V
ede | Licht
duct berekenen dat we eeodrecht op aat.
oor onze nn x,y,z vecze drie de
e een berek waarde vatentiële nor
g uit te voer
aar naar we
uur 16 – Uitw
Vector1.z ×Vector1.x ×Vector1.y ×
in OpenGL
van deze vn punt krijhet vlak in
ormaal hebctor nodig. coördinaten
kening uitvon x, y en z
rmaal te ver
en.
op zoek zij
wendig produc
× Vector2.y× Vector2.z× Vector2.x
vectoren, jgen dat
n kwestie
bben we Voor al n moeten oeren om z voor de rkrijgen.
n.
ct
y) z) x)
Saxion Hogeschool Enschede | 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.
. . .
. . ⁄
. . ⁄
. . ⁄
Top Related