Umbrele în opengl

Capitolul despre culoare și iluminare ar fi incomplet fără a discuta umbrele. Adăugarea unei umbre la scene poate îmbunătăți semnificativ realismul și eficiența vizuală.







Figurile 5.38 și 5.39 arată două cuburi luminoase. Deși ambele opțiuni sunt colorate, cubul umbra este mai convingător decât cubul fără ea.

Ce este o umbră?

Conceptual, desenarea unei umbre este destul de simplă. Umbra este obținută atunci când obiectul închide lumina de la sursa de lumină și îi împiedică să ajungă la un alt obiect sau suprafață situată în spatele obiectului care creează umbra. Zona de suprafață a obiectului umbrit pe care conturul obiectului de umbrire se suprapune pare a fi întunecat. O umbră poate fi creată programabil prin proiectarea obiectului original pe planul suprafeței care conține obiectul. Apoi obiectul este desenat în negru (sau altă culoare închisă), poate parțial transparent

Umbrele în opengl
Umbrele în opengl

Există multe metode și algoritmi pentru desenarea umbrelor (inclusiv a celor destul de complexe). Deoarece cartea este dedicată în principal interfață software OpenGL, sperăm că prin stăpânirea instrument software, veți găsi timp pentru a studia literatura de specialitate propusă în Anexa A, inclusiv cele referitoare la aparatul matematic, care este baza unei abordări programate. În capitolul 18, "Texturi de adâncime și umbre", sunt discutate mai multe instrumente pentru a sprijini direct crearea de umbre în OpenGL; În acest capitol, este suficient să se demonstreze una dintre cele mai simple metode care funcționează bine atunci când se aplică umbre pe o suprafață plană (cum ar fi pământul). Procesul de astfel de proiectare este ilustrat în Fig. 5.40.

Umbrele în opengl
Umbrele în opengl

Pentru a suprapune proiecția unui obiect pe o altă suprafață, folosim operații matrice netriviale, pe care le-am atins în capitolul precedent. Acum vom încerca să reducem procesul la cele mai simple concepte și acțiuni.

Cod de suprapunere suprapus

Așadar, trebuie să "lărgim" matricea proiectată de observare a modelului astfel încât toate obiectele reprezentate în el să fie desenate în formă bidimensională. Indiferent de orientarea obiectului, acesta se prăbușește pe planul în care se află umbra sa. Un alt lucru care trebuie luat în considerare este doi parametri: distanța față de sursa de lumină și direcția radiației. Direcția razelor sursei de lumină determină forma umbrei și afectează dimensiunea acesteia. Dacă ați văzut vreodată umbra voastră în dimineața devreme sau târziu, atunci știți cât de mult și răsucite ar putea fi, în funcție de poziția soarelui.







Se arată în Listarea funcției 5.8 gltMakeShadowMatrix glTools bibliotecii ia ca argumente cele trei puncte ale planului, unde vedeți latra umbra Zhe (aceste trei puncte nu se află pe o linie dreaptă), poziția sursei de lumină și indicele matricei de transformare, care construiește funcția . Nu vom intra în jungla de algebra liniara, dar ar trebui să fie conștienți de faptul că această funcție afișează coeficienții planului, care va fi amplasat o umbră, și cu ajutorul lor, ținând cont de poziția sursei de lumină, să construiască o matrice de transformare. Dacă această matrice este multiplicat cu observația matricea curentă -modul dacă toate obiectele desenate vor fi apoi proiectate pe acest plan.

Exemplu de umbră

Pentru a demonstra utilizarea funcției prezentată în Listing 5 jet 8 suspensie în aer deasupra solului sursa de lumină este poziționată deasupra și ușor spre stânga aeronavei Folosind tastele aeronavei săgeată poate fi rotit, în timp ce pe teren va varia în mod corespunzător producția de umbra al programului SHADOW corespunzător este prezentat în figura 5 41

Codul din Listarea 5-9 arată cum a fost creată matricea proiecției umbrite. Observați că am creat matricea o dată în funcția SetupRC și am înregistrat-o într-o variabilă globală !!

Umbrele în opengl

Listarea May 10 este sistemul de vizualizare cod „avion cu o umbră“ Inițial, atragem solul atunci descrie avionul (ca de obicei), a restabili modelul matricei de observație și se înmulțește prin umbra matricei Deci obținem matricea dorită a umbririlor. După aceea, tragem avionul din nou. (Am modificat codul, iar acum este nevoie de o etichetă de informare funcție DrawJet pentru a efectua o culoare sau de formare a imaginii alb-negru) restaurat o dată modelul de matrice de observare, trage o mică sferă galbenă aproximarea poziția sursei de lumină Rețineți că înainte de a trage avionul la avionul a fost dezactivat, vom verifica profunzimea acestui dreptunghi se află în același plan în care este tras la umbră, și trebuie să ne asigurăm că umbra este desenată. Nu am discutat ce se va întâmpla dacă tragem două obiecte sau avioane într-un singur loc. Totuși, am considerat testarea adâncimii ca mijloc de determinare a ordinii în care sunt desenate obiectele. Dacă două obiecte ocupă același loc, de obicei arată numai ultima desena forma Uneori, cu toate acestea, din cauza valorilor slabe rezoluție de adâncime se produce un dezastru complet - pixelii sunt afișate afișare amestecate, aparținând diferitelor obiecte (z) de combatere

Revenind la lumea sferelor

Ultimul exemplu este prea mare pentru a da complet codul sursă în capitolul precedent, ne-am uitat la programul SPHEREWORLD care creează o lume tridimensională populată cu animație și mișcarea aparatului foto. În acest capitol revenim din nou în lumea sferelor și adăugăm sursei luminoase și proprietăților materialelor "locuitorilor" (torus și sfere). În plus, folosind tehnologia de a impune umbre pe avion, creăm umbre pe pământ! Așa cum am menționat deja, din când în când vom reveni la acest exemplu, adăugând la acesta funcțiile OpenGL studiate. 5.42, de exemplu, arată rezultatul programului SPHEREWORLD ținând cont de materialul studiat în acest capitol.

Umbrele în opengl







Articole similare

Trimiteți-le prietenilor: