Phong skygge

Phong shading  er en model til beregning af belysning af tredimensionelle objekter, herunder polygonale modeller og primitiver, samt en metode til at interpolere belysning over hele objektet.

Glat skygge

Modeller er normalt defineret af et sæt flade, konvekse flader , selvom de fleste rigtige 3D-objekter har glatte, buede overflader. Således er den buede overflade tegnet som et ribbet polygonnet; for at dette net skal se glat ud, bruges en eller anden metode til at interpolere belysningen af ​​hjørnerne af det polygonale maske .

Hvis der anvendes Gouraud-skygge , så udføres farveberegningen ved hvert hjørne af hvert ansigt, og derefter interpoleres den beregnede farve over hele ansigtet. Som et resultat vil højlys , der skulle vises i midten af ​​polygonen, ikke blive tegnet - ved interpolering af toppunktsfarver er en klarere belysning af polygonens centrum umulig.

Phong-skygge interpolerer normalvektoren [1] . For at finde normalvektoren i et vilkårligt punkt på overfladen bruges den normaliserede vægtede sum af normalvektorerne for de flader, som dette punkt hører til:

De beregningsmæssige omkostninger ved Gouraud eller Phong shading afhænger af henholdsvis antallet af hjørner og antallet af billedfragmenter. Moderne grafikhardware bruger den anden metode, der beregner farven på hvert fragment (dvs. pixel) i stedet for hvert hjørne.

Belysningsmodel

Phong belysning omfatter også Phong belysningsmodellen, dvs. algoritme til beregning af belysning på et givet punkt. Dette er en lokal belysningsmodel, dvs. det tager kun hensyn til egenskaberne af et givet punkt og lyskilder, og ignorerer virkningerne af spredning, linser, refleksioner fra nabolegemer.

Phong-skygge kræver relativt få ressourcer, men de fleste optiske fænomener ignoreres eller beregnes med en grov tilnærmelse.

Andre belysningsmodeller kan bedre tage højde for materialeegenskaber (lokale Oren-Nayar, Cooke-Torrens, anisotrope modeller) eller komplekse optiske fænomener (globale modeller), men føre til øget overhead.

Beregningsmetode for belysning

Beregningen af ​​Phong-belysning kræver beregning af farveintensiteten af ​​de tre belysningskomponenter: baggrund (omgivende), diffus (diffus) og blank højlys (spekulær). Baggrundskomponenten er en grov tilnærmelse af lysstråler spredt af naboobjekter og derefter når et givet punkt; de resterende to komponenter simulerer spredning og reflektion af direkte stråling.

hvor

 er normalvektoren til overfladen i punktet

 - indfaldende stråle (retning til lyskilden)

 - reflekteret stråle (retning af en perfekt reflekteret stråle fra overfladen)

 — baggrundslysfaktor

 — blændingskoefficient

 — diffus belysningskoefficient


Belysning i OpenGL

I OpenGL-pipelinen beregnes farveintensiteten af ​​fragmentet for hver lyskilde separat, derefter lægges resultaterne sammen, og lyset udsendt af kroppen (GL_EMISSION) tilføjes.

Phong-belysningsberegningsalgoritmen kan illustreres ved hjælp af følgende skygger :

Vertex shader varierende vec3 n ; varierende vec3 v ; ugyldig hoved ( ugyldig ) { v = vec3 ( gl_ModelViewMatrix * gl_Vertex ); n = normaliser ( gl_NormalMatrix * gl_Normal ); gl_Position = ftransform (); } Fragment shader varierende vec3 n ; varierende vec3 v ; ugyldig hoved ( ugyldig ) { vec4 resultat = vec4 ( 0.0 ); for ( int li = 0 ; li < gl_MaxLights ; ++ li ) { vec3 viewPos = gl_LightSource [ li ]. stilling . w * v ; vec3 l = normaliser ( gl_LightSource [ li ]. position . xyz - viewPos ); vec3 e = normaliser ( -v ) ; vec3 r = normalisere ( - reflektere ( l , n )); vec4 Iamb = gl_FrontLightProduct [ li ]. omgivende ; vec4 Idiff = gl_FrontLightProduct [ li ]. diffus * max ( prik ( n , l ), ​​​​0,0 ); Idiff = klemme ( Idiff , 0,0 , 1,0 ); vec4 Ispec = gl_FrontLightProduct [ li ]. spejlende * pow ( max ( prik ( r , e ), 0,0 ), gl_FrontMaterial . glans ); Ispec = klemme ( Ispec , 0,0 , 1,0 ); resultat += Iamb + Idiff + Ispec ; } gl_FragColor = gl_FrontLightModelProduct . sceneFarve + resultat ; }

Hvor er værdien

gl_FrontLightModelProduct . sceneFarve

svarer til

gl_FrontMaterial . emission + gl_FrontMaterial . ambient * gl_LightModel . omgivende

Noter

  1. D. Rogers. Algoritmisk grundlag for computergrafik = Procedurelementer for computergrafik. - M . : Mir, 1989. - S. 394. - 512 s. — ISBN 0-07-053534-5 .

Links