• No results found

4.4 K¨ orsimulatorer

5.1.3 Projicerade texturer i den fixa pipelinen

H¨ar presenteras en metod f¨or att simulera belysningen fr˚an det egna fordonet genom att endast anv¨anda OpenGLs fixa pipelinen. Metoden har f¨ordelen att den ¨ar enkel och inte kr¨aver n˚agon funktionalitet ut¨over vad som ing˚ar i OpenGL version 1.4, se Shreiner m.fl. [23]. F¨orsta steget ¨ar att l¨asa in ett isocandeladi- agram, se Stycke 2.2, som en textur i OpenGL. Den resulterande texturen re- presenterar str˚alkastarens ljusstyrka i olika vinklar runt str˚alkastarens riktning, d.v.s. hur ljuset utbreder sig fr˚an str˚alkastaren. Figur 5.1 visar ett exempel p˚a ett isocandeladiagram som beskriver ett helljus utbredning och Figur 5.2 ett halvljus utbredning. De resulterande texturerna kallas h¨armed f¨or utbrednings- texturer.

Det ¨ar viktigt att dessa texturer har en stor f¨argskala s˚a att inte ¨overg˚angen mellan ljusstyrkorna blir blockig. Den interna representationen som anv¨ands i OpenGL ¨arGL LUMINANCE16, vilket ger en f¨argkanal med 16 bitars uppl¨osning om h˚ardvaran och OpenGL-implementationen till˚ater det. P˚a ett Geforce4 Ti4200 erh¨olls endast 8 bitars uppl¨osning, men ett GeForceFX 5900 gav 16 bitars uppl¨osning.

Dessa texturer projiceras sedan fr˚an str˚alkastarna ned p˚a omgivningen. Pro- jiceringen fungerar precis som n¨ar en projektor projicerar bilder p˚a en duk. Detta

Figur 5.3: Str˚alkastarens frustum.

kan g¨oras med n˚agra f˚a steg i OpenGL. F¨orst aktiveras OpenGL:s automatiska texturkoordinatgenerering. Eftersom texturkoordinaterna ska f¨olja med betrak- tarens riktning g˚ar det inte att anv¨anda geometrins fixerade koordinater. Ist¨allet st¨alls OpenGL in p˚a att generera texturkoordinater i str˚alkastarens koordinat- system, se Figur 5.3. Detta inneb¨ar att f¨orsta texturkoordinaten ber¨aknas som den aktuella punktens avst˚and till str˚alkastarens frustums v¨anstra plan, planet A i Figur 5.3, andra texturkoordinaten som punktens avst˚and till str˚alkastarens frustums nedre plan, planet B i Figur 5.3. En tredje texturkoordinat genereras ¨

aven, vilken tillsammans med de tv˚a f¨orsta koordinaterna beskriver en punkt i tv˚a dimensioner i homogena koordinater. Homogena koordinater beskrivs av Hearn och Baker i [17]. Den tredje koordinaten anv¨ands som en skalfaktor var- med de tv˚a f¨orsta koordinaterna divideras. Denna tredje koordinat genereras p˚a s˚a s¨att att n¨ar de tv˚a f¨orsta koordinaterna divideras med den tredje str¨acks tex- turen beroende p˚a avst˚andet fr˚an str˚alkastaren i djupled. Det ¨ar detta som g¨or att vi f˚ar en projektion av texturen som utbreder sig med avst˚andet i djupled som en pyramid och inte som ett r¨atblock, se Figur 5.3.

Ett s¨att att hitta planen A och B i Figur 5.3 ¨ar att anv¨anda str˚alkastarens projektionsmatris och modelviewmatris. Projektionsmatrisen beskriver str˚alkastarens frustum och modelviewmatrisen beskriver str˚alkastarens rotation och transla- tion, se Shreiner m.fl. [23]. Tillsammans beskriver de str˚alkastarens frustum med dess rotation och translation. Ur projektionsmatrisen och modelviewmatrisen kan planen A’, B’ respektive C’ i Figur 5.4 enkelt plockas ut som matrisrad ett, tv˚a respektive tre. Att ber¨akna texturkoordinaterna som avst˚andet till pla- nen A’ och B’ i Figur 5.4 ger koordinater i intervallet [-1, 1] d˚a intervallet [0, 1] ¨ar det som s¨oks, eftersom det ¨ar det intervall OpenGL anv¨ander f¨or tex- turuppslagning. D¨arf¨or kr¨avs en transformation fr˚an intervallet [-1, 1] till [0,

1], vilket erh˚alls genom att multiplicera den sammanslagna projektionsmatrisen och modelviewmatrisen med f¨oljande matris:

   0.5 0.0 0.0 0.5 0.0 0.5 0.0 0.5 0.0 0.0 0.5 0.5 0.0 0.0 0.0 1.0   

Att uppdatera str˚alkastarens modelviewmatris vid varje transformation som g¨ors kan vara ganska besv¨arande. Ett s¨att att beskriva matrisen ¨ar transfor- mationen fr˚an modellens koordinatsystem till betraktarens koordinatsystem till v¨arldskoordinatsystemet och sedan d¨arifr˚an till str˚alkastarens koordinatsystem. Transformationen fr˚an v¨arldskoordinatsystemet till str˚alkastarens koordinatsy- stem ¨ar enkelt att h˚alla reda p˚a d˚a allt som kr¨avs f¨or att ber¨akna detta ¨ar str˚alkastarens ackumulerade rotation och translation. Transformationen fr˚an be- traktarens koordinatsystem till v¨arldskoordinatsystemet ¨ar samma sak som den inversa transformationen fr˚an v¨arldskoordinatsystemet till betraktarens koordi- natsystem. Detta kan OpenGL hj¨alpa till med.

N¨ar OpenGL instrueras att generera texturkoordinater i betraktarens ko- ordinatsystem(GL EYE LINEAR)multiplicerar OpenGL de angivna planen med inversen av den aktuella modelviewmatrisen. Allt som kr¨avs ¨ar s˚aledes att se till att modelviewmatrisen inneh˚aller transformationen fr˚an v¨arldskoordinatsystemet till betraktarens koordinatsystem d˚a dessa plan anges. Med andra ord ¨ar allt som kr¨avs att koordinatsystemet ej flyttas mellan det att betraktaren placerats och dess att texturplanen definieras. Slutligen beh¨ovs transformationen fr˚an model- lens koordinatsystem till betraktarens koordinatsystem. Detta sk¨oter OpenGL helt automatiskt eftersom alla vertexpositioner multipliceras med den aktuella modelviewmatrisen. Observera att detta g¨ors n¨ar vertexkoordinaten specificeras och inte n¨ar texturplanen definieras. Detta beh¨over och ¨ar vanligen allts˚a inte samma version av modelviewmatrisen som texturplanen multiplicerades med.

Kodlistning B.1 s¨atter upp genereringen av texturkoordinater, s˚a som be- skrivits, i OpenGL.

Figur 5.5 visar hur helljustexturen projiceras p˚a ytan under. Eftersom tex- turen ¨ar av typGL LUMINANCE ¨ar ytan under svart f¨or att texturen ska synas s˚a bra som m¨ojligt. Everitt [12] f¨orklarar projicerad texturmappning vidare.

Metoden har hittills inte tagit h¨ansyn till att belysningsstyrkan given av en intensitet avtar med avst˚andet i kvadrat. Detta kan g¨oras med en endi- mensionell textur d¨ar belysningsstyrkans f¨orh˚allande till avst˚andet lagras, se Figur 5.6. P˚a liknande s¨att som texturkoordinaterna till texturen som beskriver ljusets utbredning genererades automatiskt kan den endimensionella texturens texturkoordinater genereras automatiskt. I det h¨ar fallet ska den genererade texturkoordinaten vara avst˚andet fr˚an ljusk¨allan s˚a att r¨att faktor sl˚as upp i texturen. Ett enkelt s¨att att g¨ora detta ¨ar att l˚ata texturkoordinaten genereras som den aktuella punktens avst˚and till planet C i Figur 5.3. Texturkoordina- ten blir inte korrekt f¨or punkter l˚angt fr˚an str˚alkastark¨aglans centrum eftersom avst˚and endast ber¨aknas i djupled sett fr˚an str˚alkastaren, men ber¨akningen blir

Figur 5.4: Str˚alkastarens frustums uppsp¨annande plan.

Figur 5.6: Texturdata f¨or belysningsstyrkans avst˚andsberoende.

enkel och resultatet blir gott nog f¨or denna enklare metod. Denna typ av textur kallas h¨armed avst˚andstextur.

Kodlistning B.2 s¨atter upp texturkoordinatgenerering f¨or den endimensio- nella texturen s˚a som tidigare beskrivits.

F¨or att slutligen s¨atta samman alltsammans renderas scenen tv˚a g˚anger. I f¨orsta passet ritas alla objekt med vanliga texturer och utan skuggning. Det allm¨anna ljuset ¨ar maximalt och ingen p˚averkan av diffust eller ˚aterfallande ljus till˚ats. Detta pass representerar scenen i maximal belysning. Resultatet efter det f¨orsta passet illustreras i Figur 5.7. F¨or att f˚a den korrekt belysta scenen ska allts˚a resultatet skuggas p˚a r¨att st¨allen. Detta g¨ors i det andra passet. Med hj¨alp av multitexturering, se Shreiner m.fl. [23], och flera texturenheter sl˚as den vanliga skuggningen fr˚an OpenGL, given av andra ljusk¨allor (t.ex. solen), sam- man med skuggningen. Resultatet fr˚an andra passet moduleras (komponentvis multiplikation) med resultatet fr˚an det f¨orsta passet. Resultatet efter det andra passet illustreras i Figur 5.8.

Att g¨ora detta f¨or b˚ada str˚alkastarna p˚a bilen i endast tv˚a pass ¨ar m¨ojligt med hj¨alp av en s˚a kallad extension, dvs en ut¨okning av OpenGL som heter

NV texture env combine4, se [8]. Det kr¨avs att grafikkortet har minst fyra textu-

renheter. Kodlistning B.3 f¨orbereder OpenGL f¨or det andra renderingspasset.

leftLight −>setupLighting()binder utbredningstexturen till texturenhet noll och

avst˚andstexturen till texturenhet ett, samt aktiverar texturkoordinatgenerering som tidigare beskrivits f¨or de b˚ada texturenheterna med avseende p˚a v¨anster str˚alkastare. rightLight−>setupLighting() g¨or motsvarande f¨or h¨oger str˚alkastare fast anv¨ander texturenhet tv˚a respektive tre ist¨allet f¨or texturenhet noll och ett.

Figur 5.7: Sk¨armdump av resultatet efter det f¨orsta renderingspasset.

Figur 5.9: Testapplikation med belysning fr˚an halvljus.

vilken till˚ater att fyra texturer, A, B, C resp D kombineras enligt A ∗ B + C ∗ D. Om A ¨ar utbredningstexturen och B ¨ar avst˚andstexturen f¨or v¨anster str˚alkastare blir A ∗ B utbredningstexturen A med avtagande belysningsstyrka enligt av- st˚andstexturen B. Med texturkoordinatsgenerering uppsatt som tidigare be- skrivits bildar detta s˚aledes den v¨anstra str˚alkastarens belysning. C ∗ D blir p˚a samma s¨att den h¨ogra str˚alkastarens belysning. A ∗ B + C ∗ D blir d˚a b˚ada str˚alkastarnas belysning. Texturenhet tre tar sedan resultatet (GL PREVIOUS)

och l¨agger till belysningen fr˚an andra ljusk¨allor, dvs resultatet fr˚an OpenGL:s fragmentber¨akningar innan texturering (GL PRIMARY COLOR).

Denna metod implementerades endast i en testapplikation f¨or att utv¨ardera metodens potential. Den visuella kvaliteten ¨ar dock inte tillr¨acklig f¨or att me- toden ska implementeras i sj¨alva simulatorn. Den fr¨amsta bristen ¨ar att be- lysningen ¨ar oberoende av ytans orientering relativt str˚alkastarna. Figur 5.9 visar resultatet i testapplikationen med belysning fr˚an halvljus och Figur 5.10 resultatet med belysning fr˚an helljus.

Related documents