Phong varjostus

Phong-varjostus  on malli kolmiulotteisten kohteiden valaistuksen laskemiseen, mukaan lukien monikulmiomallit ja primitiivit, sekä menetelmä valaistuksen interpoloimiseksi koko kohteen yli.

Tasainen varjostus

Mallit määritellään yleensä joukolla litteitä, kuperia pintoja , vaikka useimmissa todellisissa 3D-objekteissa on sileät, kaarevat pinnat. Siten kaareva pinta piirretään uurteisena monikulmioverkkona; jotta tämä verkko näyttäisi sileältä, käytetään yhtä tai toista menetelmää monikulmioverkon kärkien valaistuksen interpoloimiseksi .

Jos käytetään Gouraud-sävytystä , värilaskenta suoritetaan jokaisen pinnan jokaisessa kärjessä ja sitten laskettu väri interpoloidaan koko pinnalle . Tämän seurauksena kohokohtia , joiden pitäisi näkyä polygonin keskellä, ei piirretä - interpoloitaessa huippupisteiden värejä monikulmion keskipisteen kirkkaampi valaistus on mahdotonta.

Phong-varjostus interpoloi normaalivektorin [1] . Normaalivektorin löytämiseksi mielivaltaisesta pinnan pisteestä käytetään niiden pintojen normaalivektoreiden normalisoitua painotettua summaa, joihin tämä piste kuuluu:

Gouraud- tai Phong-varjostuksen laskennallinen hinta riippuu kärkien lukumäärästä ja kuvafragmenttien määrästä, vastaavasti. Nykyaikainen grafiikkalaitteisto käyttää toista menetelmää, joka laskee kunkin fragmentin (eli pikselin) värin kunkin kärjen sijaan.

Valaistusmalli

Phong-valaistus sisältää myös Phong-valomallin, ts. algoritmi valaistuksen laskemiseksi tietyssä pisteessä. Tämä on paikallinen valaistusmalli, ts. se ottaa huomioon vain tietyn pisteen ja valonlähteiden ominaisuudet jättäen huomioimatta sironnan, linssin ja viereisten kappaleiden heijastukset.

Phong-varjostus vaatii suhteellisen vähän resursseja, mutta suurin osa optisista ilmiöistä jätetään huomiotta tai lasketaan karkealla likiarvolla.

Muut valaistusmallit saattavat ottaa paremmin huomioon materiaalin ominaisuudet (paikallinen Oren-Nayar, Cooke-Torrens, anisotrooppiset mallit) tai monimutkaiset optiset ilmiöt (globaalit mallit), mutta ne voivat johtaa lisääntyneisiin yleiskustannuksiin.

Valaistuslaskentamenetelmä

Phong-valaistuksen laskeminen edellyttää kolmen valaistuskomponentin värivoimakkuuden laskemista: tausta (ambient), haja (diffuusi) ja kiiltävät kohokohdat (pekulaarinen). Taustakomponentti on karkea arvio valonsäteistä , jotka naapurikohteet sirottavat ja sitten saavuttavat tietyn pisteen; muut kaksi komponenttia simuloivat suoran säteilyn sirontaa ja heijastusta.

missä

 on pinnan normaalivektori pisteessä

 - tuleva säde (suunta valonlähteeseen)

 - heijastunut säde (täysin heijastuneen säteen suunta pinnasta)

 — taustavalaistustekijä

 - häikäisykerroin

 — hajavalaistuskerroin


Valaistus OpenGL:ssä

OpenGL-liukuhihnassa fragmentin värin intensiteetti lasketaan kullekin valonlähteelle erikseen, sitten lasketaan tulokset yhteen ja lisätään kehon emittoima valo (GL_EMISSION).

Phong-valaistuslaskenta-algoritmi voidaan havainnollistaa seuraavilla varjostimilla :

Vertex shader vaihteleva vec3n ; _ vaihteleva vec3v ; _ void main ( void ) { v = vec3 ( gl_ModelViewMatrix * gl_Vertex ); n = normalisoi ( gl_NormalMatrix * gl_Normal ); gl_Position = ftransform (); } Fragment shader vaihteleva vec3n ; _ vaihteleva vec3v ; _ void main ( void ) { vec4 tulos = vec4 ( 0,0 ); for ( int li = 0 ; li < gl_MaxLights ; ++ li ) { vec3 viewPos = gl_LightSource [ li ]. asemaa . w * v ; vec3 l = normalisoi ( gl_LightSource [ li ]. position . xyz - viewPos ); vec3 e = normalisoi ( -v ) ; vec3 r = normalisoi ( - heijastaa ( l , n )); vec4 Iamb = gl_FrontLightProduct [ li ]. ambient ; vec4 Idiff = gl_FrontLightProduct [ li ]. diffuusi * max ( piste ( n , l ), ​​0,0 ); Idiff = puristin ( Idiff , 0,0 , 1,0 ); vec4 Ispec = gl_FrontLightProduct [ li ]. heijastava * pow ( max ( piste ( r , e ), 0,0 ), gl_FrontMaterial . kiilto ); Ispec = puristin ( Ispec , 0,0 , 1,0 ); tulos += Iamb + Idiff + Ispec ; } gl_FragColor = gl_FrontLightModelProduct . sceneColor + tulos ; }

Missä on arvo

gl_FrontLightModelProduct . sceneColor

on vastaava

gl_FrontMaterial . päästö + gl_FrontMaterial . ambient * gl_LightModel . ambient

Muistiinpanot

  1. D. Rogers. Tietokonegrafiikan algoritmiset perusteet = Procedural Elements for Computer Graphics. - M .: Mir, 1989. - S. 394. - 512 s. — ISBN 0-07-053534-5 .

Linkit