Download - Dynamic Lighting with OpenGL

Transcript
Page 1: Dynamic Lighting with OpenGL

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

Page 2: Dynamic Lighting with OpenGL

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.

Page 3: Dynamic Lighting with OpenGL

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

Page 4: Dynamic Lighting with OpenGL

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.

Page 5: Dynamic Lighting with OpenGL

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

Page 6: Dynamic Lighting with OpenGL

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

Page 7: Dynamic Lighting with OpenGL

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,

Page 8: Dynamic Lighting with OpenGL

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.

Page 9: Dynamic Lighting with OpenGL

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.

Page 10: Dynamic Lighting with OpenGL

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

Page 11: Dynamic Lighting with OpenGL

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

Page 12: Dynamic Lighting with OpenGL

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

Page 13: Dynamic Lighting with OpenGL

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.

Page 14: Dynamic Lighting with OpenGL

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.

Page 15: Dynamic Lighting with OpenGL

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.

Page 16: Dynamic Lighting with OpenGL

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);

Page 17: Dynamic Lighting with OpenGL

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);

Page 18: Dynamic Lighting with OpenGL

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);

Page 19: Dynamic Lighting with OpenGL

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.

Page 20: Dynamic Lighting with OpenGL

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

Page 21: Dynamic Lighting with OpenGL

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);

Page 22: Dynamic Lighting with OpenGL

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.

Page 23: Dynamic Lighting with OpenGL

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);

Page 24: Dynamic Lighting with OpenGL

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

Page 25: Dynamic Lighting with OpenGL

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

Page 26: Dynamic Lighting with OpenGL

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)

Page 27: Dynamic Lighting with OpenGL

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.

. . .

. . ⁄

. . ⁄

. . ⁄