Phong skuggning

Phong shading  är en modell för att beräkna belysningen av tredimensionella objekt, inklusive polygonala modeller och primitiver, samt en metod för att interpolera belysning över hela objektet.

Jämn skuggning

Modeller definieras vanligtvis av en uppsättning plana, konvexa ytor , även om de flesta riktiga 3D-objekt har släta, böjda ytor. Således ritas den krökta ytan som ett räfflat polygonnät; för att detta nät ska se jämnt ut används en eller annan metod för att interpolera belysningen av det polygonala nätets hörn .

Om Gouraud-skuggning används utförs färgberäkningen vid varje vertex av varje ansikte, och sedan interpoleras den beräknade färgen över hela ansiktet. Som ett resultat kommer högdagrar som ska visas i mitten av polygonen inte att ritas - när du interpolerar vertexfärger är en starkare belysning av polygonens mitt omöjlig.

Phong-skuggning interpolerar normalvektorn [1] . För att hitta normalvektorn vid en godtycklig punkt på ytan används den normaliserade viktade summan av normalvektorerna för de ytor som denna punkt tillhör:

Beräkningskostnaden för Gouraud- eller Phong-skuggning beror på antalet hörn respektive antalet bildfragment. Modern grafikhårdvara använder den andra metoden, som beräknar färgen på varje fragment (dvs. pixel) snarare än varje vertex.

Belysningsmodell

Till Phong-belysning hör även belysningsmodellen Phong, d.v.s. algoritm för att beräkna belysning vid en given punkt. Detta är en lokal belysningsmodell, d.v.s. den tar endast hänsyn till egenskaperna hos en given punkt och ljuskällor, och ignorerar effekterna av spridning, linsning, reflektioner från närliggande kroppar.

Phong-skuggning kräver relativt få resurser, men de flesta optiska fenomen ignoreras eller beräknas med en grov approximation.

Andra belysningsmodeller kan bättre ta hänsyn till materialegenskaper (lokala Oren-Nayar, Cooke-Torrens, anisotropa modeller) eller komplexa optiska fenomen (globala modeller), men leda till ökad overhead.

Beräkningsmetod för belysning

Beräkningen av Phong-belysning kräver beräkning av färgintensiteten för de tre belysningskomponenterna: bakgrund (omgivande), diffus (diffus) och glänsande högdagrar (spegel). Bakgrundskomponenten är en grov approximation av ljusstrålar som sprids av angränsande föremål och sedan når en given punkt; de återstående två komponenterna simulerar spridningen och reflektionen av direkt strålning.

var

 är normalvektorn till ytan vid punkten

 - infallande stråle (riktning mot ljuskällan)

 - reflekterad stråle (riktningen för en perfekt reflekterad stråle från ytan)

 — Bakgrundsbelysningsfaktor

 — bländningskoefficient

 — Koefficient för diffus belysning


Belysning i OpenGL

I OpenGL pipeline beräknas fragmentets färgintensitet för varje ljuskälla separat, sedan läggs resultaten ihop och ljuset som emitteras av kroppen (GL_EMISSION) läggs till.

Beräkningsalgoritmen för Phong-belysning kan illustreras med hjälp av följande shaders :

Vertex shader varierande vec3n ; _ varierande vec3 v ; void huvudsaklig ( void ) { v = vec3 ( gl_ModelViewMatrix * gl_Vertex ); n = normalisera ( gl_NormalMatrix * gl_Normal ); gl_Position = ftransform (); } Fragment shader varierande vec3n ; _ varierande vec3 v ; void huvudsaklig ( void ) { vec4 resultat = vec4 ( 0.0 ); for ( int li = 0 ; li < gl_MaxLights ; ++ li ) { vec3 viewPos = gl_LightSource [ li ]. position . w * v ; vec3 l = normalisera ( gl_LightSource [ li ]. position . xyz - viewPos ); vec3 e = normalisera ( -v ) ; vec3 r = normalisera ( -reflektera ( l , n ) ); vec4 Iamb = gl_FrontLightProduct [ li ]. omgivande ; vec4 Idiff = gl_FrontLightProduct [ li ]. diffus * max ( punkt ( n , l ), ​​​​0,0 ); Idiff = klämma ( Idiff , 0,0 , 1,0 ); vec4 Ispec = gl_FrontLightProduct [ li ]. speglande * pow ( max ( punkt ( r , e ), 0,0 ), gl_FrontMaterial . glans ); Ispec = klämma ( Ispec , 0,0 , 1,0 ); resultat += Iamb + Idiff + Ispec ; } gl_FragColor = gl_FrontLightModelProduct . sceneColor + resultat ; }

Var ligger värdet

gl_FrontLightModelProduct . scenFärg

är ekvivalent med

gl_FrontMaterial . emission + gl_FrontMaterial . ambient * gl_LightModel . omgivande

Anteckningar

  1. D. Rogers. Algoritmiska grunder för datorgrafik = Procedurelement för datorgrafik. - M . : Mir, 1989. - S. 394. - 512 sid. — ISBN 0-07-053534-5 .

Länkar