Ce sunt umbrele din joc? Cum se instalează umbrele pe Minecraft? Ce răspund umbrele.

Odată cu computerizarea globală, un număr imens de termeni de neînțeles au venit în lumea noastră. A face față tuturor nu este atât de ușor pe cât pare la prima vedere. Multe dintre ele au nume similare, multe au funcționalități largi. Este timpul să aflăm ce este un shader, de unde a venit, pentru ce este și pentru ce este.

Optimizator

Cel mai probabil, ești un jucător pasionat de Minecraft și de aceea ai ajuns să afli ce este. Trebuie remarcat imediat că conceptul de „shader” este ușor separat de acest joc și poate „trăi” separat de el. La fel ca modurile. Prin urmare, nu merită să conectați strâns aceste două concepte.

În general, shader-ul provine din programare, a apărut ca asistent al specialiștilor. Probabil va fi tare să numiți acest instrument un optimizator, dar îmbunătățește într-adevăr imaginea din jocuri. Deci, când ați început deja să înțelegeți aproximativ ce este, să trecem la o interpretare exactă.

Interpretare

Ce este un Shader? care este executat de procesoarele plăcii video. Aceste instrumente sunt dezvoltate într-un limbaj special. În funcție de scop, poate fi diferit. După aceea, umbrele sunt traduse condiționat în instrucțiuni pentru procesoarele de accelerare grafică.

Cerere

Trebuie spus imediat că aplicația în ansamblu este predeterminată de scop. Programele sunt încorporate în procesoarele de plăci video, ceea ce înseamnă că lucrează la parametrii obiectelor și imaginilor grafice tridimensionale. Aceștia pot îndeplini o varietate de sarcini, inclusiv lucrul cu reflexia, refracția, întunecarea, efectele de forfecare etc.

Premisă

Oamenii încearcă să afle ce este un shader de mult timp. Chiar înainte de aceste programe, dezvoltatorii făceau totul manual. Procesul de formare a unei imagini din unele obiecte nu a fost automatizat. Înainte ca jocul să se nască, dezvoltatorii au făcut singuri randarea. Au lucrat cu un algoritm, l-au compus pentru diferite sarcini. Așadar, au existat instrucțiuni pentru aplicarea texturilor, a efectelor video etc.

Desigur, unele procese au fost încă integrate în activitatea plăcilor video. Astfel de algoritmi ar putea fi folosiți de dezvoltatori. Dar nu au reușit să-și impună algoritmii pe placa video. Instrucțiuni non-standard ar putea fi executate de CPU, care era mai lent decât GPU.

Exemplu

Pentru a înțelege diferența, merită să ne uităm la câteva exemple. Evident, într-un joc, redarea ar putea fi hardware și software. De exemplu, ne amintim cu toții de celebrul Quake 2. Deci, apa din joc ar putea fi doar un filtru albastru atunci când vine vorba de redarea hardware. Dar cu intervenția software-ului, a apărut o stropire de apă. Este aceeași poveste cu CS 1.6. Redarea hardware a dat doar un blitz alb, în ​​timp ce randarea software a adăugat un ecran pixelat.

Acces

Deci, a devenit clar că este necesar să se rezolve astfel de probleme. Acceleratoarele grafice au început să extindă numărul de algoritmi care erau populari printre dezvoltatori. A devenit clar că era imposibil să „umplem” totul. A fost necesar să se deschidă accesul la specialiștii în plăci video.

Înainte de a exista jocuri precum „Minecraft” cu moduri și umbrere, dezvoltatorii aveau posibilitatea să lucreze cu blocuri GPU în conducte care ar putea fi responsabile pentru instrucțiuni diferite. Așa au devenit cunoscute programele cu numele „shader”. Pentru a le crea, au fost dezvoltate special limbaje de programare. Deci, plăcile video au început să fie încărcate nu numai cu „geometrie” standard, ci și cu instrucțiuni pentru procesor.

Când un astfel de acces a devenit posibil, au început să se deschidă noi posibilități de programare. Specialiștii ar putea rezolva probleme matematice pe GPU. Aceste calcule au devenit cunoscute sub numele de GPGPU. Acest proces a necesitat instrumente speciale. De la nVidia CUDA, Microsoft DirectCompute și cadrul OpenCL.

Tipuri

Cu cât oamenii au învățat mai mult ce sunt umbrele, cu atât au fost dezvăluite mai multe informații despre ele și despre capacitățile lor. Inițial, acceleratoarele aveau trei procesoare. Fiecare era responsabil pentru propriul tip de umbră. De-a lungul timpului, au fost înlocuiți cu unul universal. Fiecare avea un anumit set de instrucțiuni care avea trei tipuri de umbrere simultan. În ciuda unificării lucrării, descrierea fiecărui tip a supraviețuit până în prezent.

Tipul de vârf a funcționat cu vârfurile formelor care au multe fețe. Există multe instrumente implicate. De exemplu, vorbim despre coordonatele texturii, vectori tangenți, binormali sau normali.

Tipul geometric a funcționat nu doar cu un vârf, ci și cu un întreg primitiv. Pixel a fost conceput pentru a procesa fragmente de ilustrații bitmap și texturi în general.

În jocuri

Dacă sunteți în căutarea unor shadere pentru Minecraft 1.5.2, atunci cel mai probabil doriți doar să îmbunătățiți imaginea din joc. Pentru a face acest lucru posibil, programele au trecut prin „țevi de foc, apă și cupru”. Shaders au fost testați și rafinați. Ca rezultat, a devenit clar că acest instrument are avantaje și dezavantaje.

Desigur, simplitatea în compilarea diferiților algoritmi este un plus imens. Aceasta este atât flexibilitate, cât și o simplificare vizibilă în procesul de dezvoltare a jocului și, prin urmare, o scădere a costurilor. Scenele virtuale rezultate devin mai complexe și mai realiste. De asemenea, procesul de dezvoltare în sine devine de multe ori mai rapid.

Dintre neajunsuri, merită menționat doar faptul că va trebui să învățați unul dintre limbajele de programare și, de asemenea, să luați în considerare faptul că diferite seturi de algoritmi sunt situate pe diferite modele de plăci video.

Instalare

Dacă ați găsit un pachet shader pentru Minecraft, trebuie să înțelegeți că există multe capcane în instalarea sa. În ciuda popularității deja dispărute a acestui joc, fanii săi fideli rămân în continuare. Nu tuturor le place grafica, mai ales în 2017. Unii oameni cred că, datorită umbrelor, vor putea să-l îmbunătățească. În teorie, această afirmație este corectă. Dar, în practică, nu te vei schimba prea mult.

Dar dacă încă mai căutați modalități pe „Minecraft 1.7”, atunci, mai întâi de toate, fiți atenți. Procesul în sine nu este complicat. În plus, împreună cu orice fișier descărcat, există o instrucțiune pentru instalarea acestuia. Principalul lucru este să verificați versiunile jocului și ale shader-ului. În caz contrar, optimizatorul va eșua.

Există multe locuri pe Internet unde puteți instala și descărca un astfel de instrument. Apoi, trebuie să despachetați arhiva în orice folder. Acolo veți găsi fișierul „GLSL-Shaders-Mod-1.7-Installer.jar”. După ce începeți, vi se va arăta calea către joc, dacă este corectă, apoi fiți de acord cu toate instrucțiunile ulterioare.

Apoi, trebuie să mutați folderul „shaderpacks” în „.minecraft”. Acum, când porniți lansatorul, va trebui să accesați setările. Aici, dacă instalarea a fost corectă, va apărea linia „Shaders”. Puteți selecta pachetul dorit din întreaga listă.

Dacă aveți nevoie de umbrere pentru Minecraft 1.7.10, atunci găsiți doar shaderpack-ul versiunii necesare și faceți același lucru. Versiuni instabile pot fi găsite pe Internet. Uneori trebuie să schimbați, să reinstalați și să căutați unul potrivit. Este mai bine să te uiți la recenzii și să le alegi pe cele mai populare.

Introducere

Lumea graficii 3D, inclusiv jocurile, este plină de termeni. Termenii care nu au întotdeauna singura definiție corectă. Uneori aceleași lucruri sunt numite diferit și invers, același efect poate fi numit „HDR”, apoi „Bloom”, apoi „Glow”, apoi „Postprocesare” în setările jocului. Majoritatea oamenilor, din fanii dezvoltatorilor cu privire la ceea ce au încorporat în motorul lor grafic, sunt confuzi cu privire la ceea ce înseamnă cu adevărat.

Articolul este destinat să vă ajute să înțelegeți ce înseamnă unele dintre aceste cuvinte, cel mai des utilizate în astfel de cazuri. În cadrul acestui articol, nu vom vorbi despre toți termenii graficii 3D, ci doar despre cei care s-au răspândit în ultimii ani ca trăsături distinctive și tehnologii utilizate în motoarele grafice de jocuri și ca nume pentru setările grafice ale jocurilor moderne. . Pentru început, vă recomand să vă familiarizați cu.

Dacă ceva din acest articol și din articolele lui Alexandru nu vă este clar, atunci este logic să începeți de la cel mai devreme, p. Aceste articole sunt deja oarecum depășite, desigur, dar datele de bază, cele mai inițiale și importante sunt acolo. Vom vorbi despre mai mulți termeni de „nivel superior” cu dvs. Ar trebui să aveți o înțelegere de bază a graficelor 3D în timp real și a structurii conductei grafice. Pe de altă parte, nu vă așteptați la formule matematice, precizie academică și exemple de cod - nu despre asta este vorba deloc despre acest articol. Termeni

Lista termenilor descriși în articol:

Umbră

Un umbritor în sens larg este un program pentru definirea vizuală a suprafeței unui obiect. Aceasta poate fi o descriere a iluminatului, texturării, postprocesării etc. Umbrele au crescut din copacii de umbră ai lui Cook și din limbajul fluxului de pixeli al lui Perlin. RenderMan Shading Language este acum cel mai faimos. Umbrele programabile au fost introduse pentru prima dată în Pixar's RenderMan, care definește mai multe tipuri de umbrere: umbrele sursei de lumină, umbrele de suprafață, umbrele de deplasare, umbrele de volum , umbrere imager. Aceste umbrere sunt cel mai adesea executate în software de procesoare universale și nu au o implementare hardware completă. Ulterior, mulți cercetători au descris limbaje similare cu RenderMan, dar au fost deja proiectate pentru accelerarea hardware: sistemul PixelFlow (Olano și Lastra), Quake Shader Language (folosit de id Software în motorul grafic al jocului Quake III, care descria redarea multi-pass) etc. Peercy și colegii săi au dezvoltat o tehnică pentru executarea programelor cu bucle și condiții pe arhitecturi hardware tradiționale folosind mai multe treceri de redare. RenderMan shaders s-au rupt în mai multe Numărul de pase care au fost combinate în framebuffer. Mai târziu au existat limbi pe care le vedem hardware accelerate în DirectX și OpenGL. Acesta este modul în care umbrele au fost adaptate pentru aplicații grafice în timp real.

Cipurile video timpurii nu erau programabile și efectuau doar acțiuni pre-programate (funcție fixă), de exemplu, algoritmul de iluminare era fixat rigid în hardware și nimic nu putea fi schimbat. Apoi, producătorii de cipuri video au introdus treptat elemente de programabilitate în cipurile lor, la început acestea fiind capabilități foarte slabe (NV10, cunoscut sub numele de NVIDIA GeForce 256, era deja capabil de unele programe primitive), care nu au primit suport software în API-ul Microsoft DirectX, dar de-a lungul timpului, posibilitățile s-au extins constant. Următorul pas a fost atât pentru NV20 (GeForce 3), cât și pentru NV2A (cipul video utilizat în consola de jocuri Microsoft Xbox), care au devenit primele cipuri cu suport hardware pentru shadere DirectX API. Versiunea Shader Model 1.0 / 1.1, care a apărut în DirectX 8, era foarte limitată, fiecare shader (în special cel pixel) putea fi relativ scurt și combina un set foarte limitat de instrucțiuni. Mai târziu, Shader Model 1 (SM1 pe scurt) a fost îmbunătățit cu Pixel Shaders 1.4 (ATI R200), care oferea mai multă flexibilitate, dar avea și capacități prea limitate. Umbrele din acea vreme au fost scrise în așa-numitul limbaj shader de asamblare, care este aproape de limbajul de asamblare pentru procesoarele de scop general. Nivelul său scăzut aduce anumite dificultăți pentru înțelegerea codului și a programării, mai ales atunci când codul programului este mare, deoarece este departe de eleganța și structurarea limbajelor de programare moderne.

Versiunea Shader Model 2.0 (SM2), care a apărut în DirectX 9 (care a fost susținută de cipul video ATI R300, care a devenit primul GPU cu suport pentru modelul Shader versiunea 2.0), a extins semnificativ capacitățile umbrelor în timp real, oferind umbrere mai lungi și mai complexe și un set de instrucțiuni extins semnificativ. A fost adăugată capacitatea de a efectua calcule în virgulă mobilă în umbrele de pixeli, ceea ce a reprezentat și o îmbunătățire majoră. DirectX 9, în fața capabilităților SM2, a introdus, de asemenea, limbajul shader la nivel înalt (HLSL), care este foarte similar cu limbajul C. Și un compilator eficient care traduce programele HLSL într-un cod de nivel scăzut, prietenos cu hardware-ul. Mai mult, există mai multe profiluri disponibile pentru diferite arhitecturi hardware. Acum, dezvoltatorul poate scrie un cod HLSL shader și îl poate compila folosind DirectX în programul optim pentru cipul video instalat de utilizator. După aceea, au fost lansate cipuri de la NVIDIA, NV30 și NV40, care au îmbunătățit capabilitățile umbrelor hardware cu un pas mai departe, adăugând umbrere și mai lungi, posibilitatea tranzițiilor dinamice în umbrele vertex și pixel, capacitatea de a prelua texturi din umbrele vertex etc. nu au fost, sunt așteptați spre sfârșitul anului 2006 în DirectX 10 ...

În general, umbrele au adăugat o mulțime de noi capacități la conducta grafică pentru transformarea și iluminarea vârfurilor și procesarea individuală a pixelilor așa cum doresc dezvoltatorii fiecărei aplicații specifice. Și totuși, capacitățile umbrelor hardware nu au fost încă dezvăluite pe deplin în aplicații și, pe măsură ce capabilitățile lor cresc în fiecare nouă generație de hardware, vom vedea în curând nivelul acelor umbrere RenderMan care păreau cândva inaccesibile pentru acceleratorii de jocuri video. Până în prezent, în modelele de shader în timp real acceptate de acceleratoare video hardware, sunt definite doar două tipuri de umbrere: și (în definiția API-ului DirectX 9). În viitor, DirectX 10 promite să le adauge din ce în ce mai mult.

Vertex Shader

Vertex shaders sunt programe executate de cipuri video care efectuează operații matematice cu vârfuri (vârf, ele alcătuiesc obiecte 3D în jocuri), cu alte cuvinte, oferă abilitatea de a executa algoritmi programabili pentru modificarea parametrilor vârfurilor și a iluminării acestora (T&L - Transformare și iluminare) ... Fiecare vârf este definit de mai multe variabile, de exemplu, poziția unui vârf în spațiul 3D este determinată de coordonatele: x, y și z. Vârfurile pot fi, de asemenea, descrise prin caracteristicile culorilor, coordonatele texturii și altele asemenea. Umbrele de vertex, în funcție de algoritmi, modifică aceste date pe parcursul activității lor, de exemplu, calculând și scriind noi coordonate și / sau culori. Adică, datele de intrare ale umbrelor vertexului sunt date despre un vârf al modelului geometric care este în curs de procesare. De obicei, acestea sunt coordonate spațiale, normale, componente de culoare și coordonate de textură. Datele rezultate ale programului executat servesc ca intrare pentru partea ulterioară a conductei, rasterizatorul efectuează interpolare liniară a datelor de intrare pentru suprafața triunghiului și pentru fiecare pixel execută pixel shader-ul corespunzător. Un exemplu foarte simplu și dur (dar clar, sper): un vertex shader vă permite să luați un obiect sferă 3D și să folosiți un vertex shader pentru a crea un cub verde din el :).

Înainte de apariția cipului video NV20, dezvoltatorii aveau două modalități, fie să-și folosească propriile programe și algoritmi care schimbă parametrii vârfurilor, dar apoi toate calculele ar fi făcute de CPU (software T&L), fie să se bazeze pe date fixe algoritmi în cipuri video, cu suport pentru transformarea și iluminarea hardware (hardware T&L). Primul model DirectX Shader a însemnat un mare pas înainte de la funcții fixe pentru transformarea și iluminarea vârfurilor la algoritmi complet programabili. A devenit posibil, de exemplu, să se execute algoritmul de jupuire în întregime pe cipuri video și, înainte de aceasta, singura posibilitate a fost executarea lor pe procesoare centrale universale. Acum, cu capabilitățile mult îmbunătățite de pe vremea cipului NVIDIA menționat mai sus, puteți face multe cu vârfuri folosind umbrere de vârf (cu excepția creării lor, poate) ...

Exemple de cum și unde sunt aplicate umbrele de vârf:

Pixel Shader

Pixel shaders sunt programe executate de cipul video în timpul rasterizării pentru fiecare pixel al imaginii, efectuează eșantionarea texturii și / sau operații matematice asupra valorii culorii și adâncimii (tampon Z) a pixelilor. Toate instrucțiunile pixel shader sunt executate pixel cu pixel după ce operațiunile de transformare a geometriei și de iluminare sunt terminate. Ca rezultat al activității sale, pixel shader produce valoarea finală a culorii pixelilor și valoarea Z pentru etapa următoare a conductei grafice, amestecând. Cel mai simplu exemplu de pixel shader care poate fi citat: multitexturarea banală, doar amestecarea a două texturi (difuză și lightmap, de exemplu) și impunerea rezultatului calculului pe un pixel.

Înainte de apariția cipurilor video cu suport hardware pentru umbrere de pixeli, dezvoltatorii aveau doar oportunități pentru multitexturarea convențională și amestecul alfa, care limitau în mod semnificativ posibilitățile pentru multe efecte vizuale și nu permiteau să se facă mult din ceea ce este acum disponibil. Și dacă cu geometria altceva ar putea fi făcut programatic, atunci cu pixeli - nu. Primele versiuni ale DirectX (până la 7.0 inclusiv) au efectuat întotdeauna toate calculele pe verticală și au oferit o funcționalitate extrem de limitată pentru iluminarea pe pixeli (amintiți-vă EMBM - cartografiere de mediu și DOT3) în cele mai recente versiuni. Umbrele de pixeli au făcut posibilă iluminarea oricărei suprafețe pixel cu pixel folosind materiale programate de dezvoltator. Pixel shaders 1.1 (în sensul DirectX) care a apărut în NV20 nu putea face doar multitexturarea, ci și mult mai mult, deși majoritatea jocurilor care foloseau SM1 pur și simplu foloseau multitexturarea tradițională pe majoritatea suprafețelor, executând umbrere de pixeli mai complexe doar pe o parte a suprafețe, pentru a crea o varietate de efecte speciale (toată lumea știe că apa este în continuare cel mai frecvent exemplu de utilizare a pixel shaders în jocuri). Acum, după apariția SM3 și a cipurilor video care le susțin, capacitățile pixel shaders-urilor au crescut pentru a permite chiar și raytracing-ul cu ajutorul lor, deși cu unele limitări.

Exemple de utilizare a pixel shaders:

Texturi procedurale

Texturile procedurale sunt texturi descrise prin formule matematice. Astfel de texturi nu ocupă spațiu în memoria video, sunt create de pixel shader „din mers”, fiecare dintre elementele lor (texel) este obținut ca urmare a executării comenzilor corespunzătoare shader. Cele mai frecvente texturi procedurale sunt: ​​diferite tipuri de zgomot (de exemplu, zgomotul fractal), lemn, apă, lavă, fum, marmură, foc etc., adică cele care pot fi descrise matematic într-un mod relativ simplu. Texturile procedurale vă permit, de asemenea, să utilizați texturi animate doar cu o ușoară modificare a formulelor matematice. De exemplu, norii realizați în acest fel arată destul de decent atât în ​​dinamică, cât și în statică.

Avantajele texturilor procedurale includ, de asemenea, un nivel nelimitat de detalii pentru fiecare textură, pur și simplu nu va exista pixelare, textura este întotdeauna generată la dimensiunea necesară pentru a o afișa. Animatul este, de asemenea, de mare interes, cu ajutorul acestuia puteți face valuri pe apă, fără a utiliza texturi animate precalculate. Un alt plus al unor astfel de texturi este că, cu cât sunt utilizate mai mult într-un produs, cu atât mai puține lucrări pentru artiști (deși mai multe pentru programatori) pentru a crea texturi regulate.

Din păcate, texturile procedurale nu au fost încă folosite în mod corespunzător în jocuri, în aplicațiile reale este încă adesea mai ușor să încărcați o textură obișnuită, volumele de memorie video cresc cu salturi, în cele mai moderne acceleratoare instalează deja 512 megabytes de memorie video dedicată, care este necesară mai mult decât pentru a împrumuta ceva. Mai mult, ei încă fac adesea opusul - pentru a accelera matematica în pixel shaders, folosesc tabele de căutare (LUT) - texturi speciale care conțin valori precalculate obținute ca urmare a calculelor. Pentru a nu număra câteva instrucțiuni matematice pentru fiecare pixel, citesc pur și simplu valorile precalculate din textură. Dar cu cât mai mult, cu atât accentul ar trebui să se îndrepte spre calculele matematice, să ia aceeași generație de cipuri video ATI: RV530 și R580, care au procesoare de 12 și 48 pixeli pentru fiecare 4 și respectiv 16 unități de textură. Mai mult, dacă vorbim despre texturi 3D, deoarece dacă texturile bidimensionale pot fi plasate fără probleme în memoria locală a acceleratorului, atunci texturile 3D necesită mult mai mult din aceasta.

Exemple de texturi procedurale:

Bump Mapping / Specular Bump Mapping

Bumpmapping este o tehnică pentru simularea neregulilor (sau modelarea microreliefului, după preferință) pe o suprafață plană, fără costuri de calcul mari și modificări de geometrie. Pentru fiecare pixel din suprafață, se efectuează un calcul al iluminării pe baza valorilor dintr-o hartă specială a înălțimii numită bumpmap. Aceasta este de obicei o textură alb-negru pe 8 biți, iar valorile culorii texturii nu sunt suprapuse ca texturile obișnuite, ci sunt folosite pentru a descrie rugozitatea suprafeței. Culoarea fiecărui texel determină înălțimea punctului de relief corespunzător, valori mai mari înseamnă înălțime mai mare deasupra suprafeței inițiale și valori mai mici, respectiv, mai mici. Sau vice versa.

Gradul de iluminare al unui punct depinde de unghiul de incidență al razelor de lumină. Cu cât unghiul dintre normal și raza de lumină este mai mic, cu atât iluminarea unui punct de pe suprafață este mai mare. Adică, dacă luați o suprafață plană, atunci normalele din fiecare punct vor fi aceleași și iluminarea va fi, de asemenea, aceeași. Și dacă suprafața este inegală (de fapt, aproape toate suprafețele din realitate), atunci normalele din fiecare punct vor fi diferite. Și iluminarea este diferită, la un moment dat va fi mai mult, la altul - mai puțin. De aici principiul bumpmapping - pentru modelarea neregulilor pentru diferite puncte ale poligonului, sunt stabilite normele de suprafață, care sunt luate în considerare la calcularea iluminării pe pixel. Ca urmare, se obține o imagine mai naturală a suprafeței, bumpmapping oferă suprafețelor mai multe detalii, cum ar fi umflături pe cărămizi, pori pe piele etc., fără a crește complexitatea geometrică a modelului, deoarece calculele se efectuează la nivelul pixelilor. Mai mult, atunci când poziția sursei de lumină se schimbă, iluminarea acestor nereguli se schimbă corect.

Desigur, iluminarea vertexului este mult mai simplă din punct de vedere al calculului, dar pare prea nerealistă, mai ales cu geometrie relativ scăzută din poli, interpolarea culorii pentru fiecare pixel nu poate reproduce valori mai mari decât valorile calculate pentru vârfuri. Adică, pixelii din mijlocul triunghiului nu pot fi mai luminoși decât fragmentele din apropierea vârfului. În consecință, zonele cu schimbări bruște de iluminare, cum ar fi strălucirea și sursele de lumină foarte aproape de suprafață, nu vor fi afișate corect din punct de vedere fizic, iar acest lucru va fi deosebit de vizibil în dinamică. Desigur, problema poate fi rezolvată parțial prin creșterea complexității geometrice a modelului, împărțindu-l în mai multe vârfuri și triunghiuri, dar iluminarea pixel cu pixel este cea mai bună opțiune.

Pentru a continua, trebuie să reamintim despre componentele iluminatului. Culoarea unui punct de suprafață este calculată ca suma componentelor ambientale, difuze și speculare din toate sursele de lumină din scenă (în mod ideal din toate, adesea neglijate de mulți). Contribuția la această valoare de la fiecare sursă de lumină depinde de distanța dintre sursa de lumină și un punct de la suprafață.

Componente de iluminat:

Acum, să adăugăm o cartografiere cu bump la aceasta:

Componenta uniformă (ambientală) a iluminatului este o aproximație, iluminare „inițială” pentru fiecare punct al scenei, la care toate punctele sunt iluminate în mod egal și iluminarea nu depinde de alți factori.
Componenta difuză a luminii depinde de poziția sursei de lumină și de suprafața normală. Această componentă de iluminare este diferită pentru fiecare vârf al obiectului, ceea ce le conferă volum. Lumina nu mai umple suprafața cu aceeași umbră.
Componenta speculară a iluminării se manifestă prin reflectarea razelor de lumină de la suprafață. Pentru calculul acesteia, pe lângă vectorul poziției sursei de lumină și normalul, se folosesc încă doi vectori: vectorul direcției privirii și vectorul de reflexie. Modelul de iluminat specular a fost propus pentru prima dată de Phong Bui-Tong. Aceste flare cresc semnificativ realismul imaginii, deoarece suprafețele reale rare nu reflectă lumina, astfel încât componenta speculară este foarte importantă. Mai ales în mișcare, deoarece strălucirea arată imediat schimbarea poziției camerei sau a obiectului în sine. Ulterior, cercetătorii au venit cu alte modalități de a calcula această componentă, mai complexă (Blinn, Cook-Torrance, Ward), ținând cont de distribuția energiei luminoase, absorbția acesteia de către materiale și împrăștierea sub formă de componentă difuză.

Deci, maparea speculară a loviturilor se obține în acest fel:

Și să vedem același lucru cu exemplul jocului, Call of Duty 2:


Primul fragment al imaginii este redat fără bumpmapping () deloc, al doilea (sus-dreapta) este bumpmapping fără o componentă speculară, al treilea este cu o componentă speculară de mărime normală, care este folosită în joc, iar ultima , din partea dreaptă-jos, cu componenta speculară maximă posibilă.

În ceea ce privește prima aplicație hardware, unele tipuri de bumpmapping (Emboss Bump Mapping) au început să fie utilizate în vremea plăcilor video bazate pe cipuri NVIDIA Riva TNT, dar tehnicile de atunci erau extrem de primitive și nu erau utilizate pe scară largă. Următorul tip cunoscut a fost Environment Mapped Bump Mapping (EMBM), dar numai plăcile video Matrox aveau suport hardware în DirectX în acel moment și, din nou, utilizarea a fost sever limitată. Apoi a apărut Dot3 Bump Mapping și cipurile video de atunci (GeForce 256 și GeForce 2) au necesitat trei treceri pentru a executa complet un astfel de algoritm matematic, deoarece acestea sunt limitate de două texturi utilizate în același timp. Începând cu NV20 (GeForce3), a devenit posibil să faci același lucru într-o singură trecere folosind pixel shaders. Mai mult. Au început să folosească tehnici mai eficiente precum.

Exemple de utilizare a bumpmapping în jocuri:


Cartarea deplasărilor este o metodă de adăugare a detaliilor obiectelor 3D. Spre deosebire de bumpmapping și alte metode pe pixel, atunci când numai iluminarea unui punct este modelată corect de hărțile de înălțime, dar poziția sa în spațiu nu se schimbă, ceea ce oferă doar iluzia unei creșteri a complexității suprafeței, hărțile de deplasare vă permit să obțineți obiecte 3D complexe reale din vârfuri și poligoane, fără restricții. inerente metodelor pe pixel. Această metodă repoziționează vârfurile triunghiurilor prin normalizarea acestora cu o cantitate bazată pe valorile din hărțile de deplasare. O hartă de deplasare este de obicei o textură alb-negru, iar valorile din ea sunt utilizate pentru a determina înălțimea fiecărui punct de pe suprafața unui obiect (valorile pot fi stocate ca numere de 8 biți sau 16 biți) , asemănător unei hărți. Hărțile de deplasare sunt adesea folosite (caz în care sunt numite și hărți de înălțime) pentru a crea un teren cu dealuri și văi. Deoarece terenul este descris de o hartă de deplasare bidimensională, este relativ ușor să-l deformăm dacă este necesar, deoarece ar necesita doar modificarea hărții de deplasare și redarea suprafeței pe baza ei în cadrul următor.

Crearea unui peisaj folosind hărți de deplasare este clar arătată în imagine. Inițial, s-au folosit 4 vârfuri și 2 poligoane, ca rezultat, s-a dovedit o bucată de peisaj cu drepturi depline.

Marele avantaj al suprapunerii hărților de deplasare nu este doar capacitatea de a adăuga detalii la suprafață, ci crearea aproape completă a obiectului. Un obiect low-poly este luat, împărțit (teselat) în mai multe vârfuri și poligoane. Vârfurile produse de teselare sunt apoi deplasate de-a lungul normalului pe baza valorii citite în harta de deplasare. Ajungem cu un obiect 3D complex dintr-unul simplu folosind harta de deplasare corespunzătoare:


Numărul de triunghiuri create de teselare trebuie să fie suficient de mare pentru a surprinde toate detaliile definite de harta de deplasare. Uneori, triunghiuri suplimentare sunt create automat folosind N-patch-uri sau alte metode. Hărțile de deplasare sunt cel mai bine utilizate împreună cu cartografierea cu bump pentru a crea detalii fine acolo unde este suficientă iluminarea pixel-cu-pixel.

Cartarea deplasărilor a fost acceptată mai întâi în DirectX 9.0. Aceasta a fost prima versiune a acestui API care a acceptat tehnica de cartografiere a deplasărilor. DX9 acceptă două tipuri de cartografiere a deplasărilor, filtrate și preeșantionate. Prima metodă a fost susținută de cipul video uitat MATROX Parhelia, iar a doua - de ATI RADEON 9700. Metoda filtrată diferă prin faptul că permite utilizarea nivelurilor mip pentru hărțile de deplasare și aplicarea filtrării triliniare pentru acestea. În această metodă, nivelul mip al hărții de deplasare este selectat pentru fiecare vârf pe baza distanței de la vârf la cameră, adică nivelul de detaliu este selectat automat. Aceasta realizează o împărțire aproape uniformă a scenei atunci când triunghiurile au aproximativ aceeași dimensiune.

Cartarea deplasării poate fi considerată, în esență, ca o tehnică de compresie a geometriei; utilizarea hărților de deplasare reduce cantitatea de memorie necesară pentru un anumit detaliu al modelului 3D. Datele geometrice voluminoase sunt înlocuite cu texturi simple de deplasare 2D, de obicei pe 8 biți sau pe 16 biți. Acest lucru reduce cerințele de memorie și lățime de bandă necesare pentru a furniza date geometrice cipului video, iar aceste constrângeri se numără printre principalele pentru sistemele actuale. Alternativ, cu lățime de bandă egală și cerințe de stocare, cartarea deplasării permite modele 3D geometrice mult mai complexe. Utilizarea modelelor cu o complexitate mult mai mică, atunci când în loc de zeci sau sute de mii de triunghiuri sunt utilizate unități de mii, face posibilă și accelerarea animației lor. Sau îmbunătățiți-l aplicând algoritmi și tehnici complexe mai complexe, cum ar fi simularea pe pânză.

Un alt avantaj este că utilizarea hărților de deplasare transformă ochiurile 3D poligonale complexe în mai multe texturi 2D care sunt mai ușor de procesat. De exemplu, pentru organizare, puteți utiliza mip-mapare regulată pentru a suprapune hărți de deplasare. De asemenea, în loc de algoritmi relativ complexi pentru comprimarea ochiurilor tridimensionale, puteți utiliza metodele obișnuite de comprimare a texturilor, chiar și cele de tip JPEG. Și pentru crearea procedurală a obiectelor 3D, puteți utiliza algoritmii obișnuiți pentru texturi 2D.

Dar hărțile de deplasare au și unele limitări, nu pot fi aplicate în toate situațiile. De exemplu, obiectele netede care nu conțin multe detalii fine vor fi mai bine reprezentate ca ochiuri standard sau alte suprafețe de nivel superior, cum ar fi curbele Bezier. Pe de altă parte, modelele foarte complexe, cum ar fi copacii sau plantele, nu sunt, de asemenea, ușor de reprezentat cu hărți de deplasare. Există, de asemenea, probleme cu comoditatea utilizării lor, acest lucru necesită aproape întotdeauna utilități specializate, deoarece este foarte dificil să creăm direct hărți de deplasare (dacă nu vorbim despre obiecte simple, cum ar fi un peisaj). Multe dintre problemele inerente și limitările hărților de deplasare sunt aceleași cu cele ale, deoarece cele două metode sunt în esență două reprezentări diferite ale unei idei similare.

Ca exemplu din jocurile reale, voi cita un joc care utilizează eșantionarea texturii dintr-un vertex shader, o caracteristică care a apărut în cipurile video NVIDIA NV40 și Shader Model 3.0. Texturarea vertexului poate fi aplicată unei metode simple de cartografiere a deplasărilor, care este complet realizată de GPU, fără teselare (împărțirea în mai multe triunghiuri). Aplicarea unui astfel de algoritm este limitată, ele au sens numai dacă hărțile sunt dinamice, adică se vor schimba în proces. De exemplu, aceasta este redarea suprafețelor mari de apă, care se face în jocul Pacific Fighters:


Normalmapping este o versiune îmbunătățită a tehnicii bumpmapping descrisă anterior, o versiune extinsă a acesteia. Bumpmapping a fost dezvoltat de Blinn în 1978, unde normele de suprafață sunt modificate cu această metodă de cartografiere a terenului, pe baza informațiilor din hărțile bump. În timp ce bumpmapping schimbă doar normalul existent pentru punctele de suprafață, normalmapping înlocuiește complet normele prin preluarea valorilor lor de pe o hartă normală special pregătită. Aceste hărți sunt de obicei texturi cu valori normale pre-calculate stocate în ele, reprezentate ca componente de culoare RGB (cu toate acestea, există și formate speciale pentru hărți normale, inclusiv cele cu compresie), spre deosebire de înălțimea alb-negru pe 8 biți hărți în bumpmapping.

În general, la fel ca maparea cu bump, este, de asemenea, o metodă „ieftină” pentru adăugarea de detalii la modelele de complexitate geometrică relativ scăzută, fără a utiliza o geometrie mai reală, doar mai avansată. Una dintre cele mai interesante utilizări ale tehnicii este creșterea semnificativă a detaliilor modelelor low-poly folosind hărți normale obținute prin procesarea aceluiași model de complexitate geometrică ridicată. Hărțile normale conțin o descriere mai detaliată a suprafeței decât bumpmapping și vă permit să reprezentați forme mai complexe. Idei pentru obținerea de informații din obiecte extrem de detaliate au fost exprimate la mijlocul anilor 90 ai secolului trecut, dar apoi a fost vorba despre utilizarea pentru. Mai târziu, în 1998, au fost prezentate idei pentru transferul detaliilor sub formă de hărți normale de la modele high-poly la low-poly.

Hărțile normale oferă un mod mai eficient de stocare a datelor detaliate de suprafață decât simpla utilizare a unui număr mare de poligoane. Singura lor limitare serioasă este că nu sunt foarte potrivite pentru detalii mari, deoarece cartografierea normală nu adaugă de fapt poligoane și nici nu modifică forma obiectului, ci doar creează aspectul acestuia. Aceasta este doar o simulare a detaliilor bazate pe calcule de iluminare la nivel de pixel. La poligoanele extreme ale obiectului și la unghiurile mari de înclinare ale suprafeței, acest lucru este foarte vizibil. Prin urmare, cel mai rezonabil mod de a aplica o mapare normală este de a face modelul low poly suficient de detaliat pentru a menține forma de bază a obiectului și de a utiliza hărți normale pentru a adăuga detalii mai fine.

Hărțile normale sunt de obicei generate din două versiuni ale modelului, low și high poly. Modelul low poly constă dintr-un minimum de geometrie, formele de bază ale obiectului, iar modelul high poly conține tot ce aveți nevoie pentru detalii maxime. Apoi, folosind utilități speciale, acestea sunt comparate între ele, diferența este calculată și stocată într-o textură numită hartă normală. Atunci când îl creați, puteți utiliza suplimentar o hartă cu umflături pentru detalii foarte mici, care nu pot fi modelate nici măcar într-un model cu poli înalt (porii pielii, alte depresiuni mici).

Hărțile normale au fost inițial reprezentate ca texturi RGB obișnuite, unde componentele de culoare R, G și B (0 la 1) sunt interpretate ca coordonate X, Y și Z. Fiecare texel din harta normală este reprezentat ca un punct de suprafață normal. Hărțile normale pot fi de două tipuri: cu coordonate în spațiul model (sistem general de coordonate) sau spațiu tangent (termenul în rusă este „spațiu tangent”, sistemul local de coordonate al unui triunghi). A doua opțiune este mai des utilizată. Când hărțile normale sunt prezentate în spațiul modelului, atunci acestea trebuie să aibă trei componente, deoarece toate direcțiile pot fi reprezentate și când în sistemul de coordonate local, spațiu tangent, atunci puteți trece cu două componente și obțineți a treia într-un pixel umbra.

Aplicațiile moderne în timp real depășesc cu mult animația pre-redată în ceea ce privește calitatea imaginii, aceasta se referă, în primul rând, la calitatea iluminării și la complexitatea geometrică a scenelor. Numărul de vârfuri și triunghiuri calculate în timp real este limitat. Prin urmare, metodele de reducere a cantității de geometrie sunt foarte importante. Înainte de cartografierea normală, au fost dezvoltate mai multe astfel de metode, dar modelele low poly, chiar și cu bumpmapping, sunt mult mai rele decât modelele mai complexe. Deși cartografierea normală are mai multe dezavantaje (cea mai evidentă - deoarece modelul rămâne low-poly, acest lucru este ușor de văzut de marginile sale unghiulare), calitatea redării finale este îmbunătățită în mod vizibil, lăsând complexitatea geometrică a modelelor scăzută. Recent, o creștere a popularității acestei tehnici și utilizarea acesteia în toate motoarele de joc populare au fost clar vizibile. Acest lucru se datorează combinației de calitate excelentă rezultată și reducerii simultane a cerințelor pentru complexitatea geometrică a modelelor. Tehnica normală de cartografiere este acum utilizată aproape peste tot, toate jocurile noi o folosesc cât mai mult posibil. Iată doar o scurtă listă de celebre jocuri pe PC care folosesc cartografierea normală: Far Cry, Doom 3, Half-Life 2, Call of Duty 2, FEAR, Quake 4. Toate arată mult mai bine decât jocurile din trecut, inclusiv datorită utilizarea hărților normale.

Există o singură consecință negativă a utilizării acestei tehnici - o creștere a volumului texturilor. La urma urmei, o hartă normală influențează puternic modul în care va arăta un obiect și trebuie să aibă o rezoluție suficient de mare, astfel încât cerințele pentru memoria video și lățimea sa de bandă sunt dublate (în cazul hărților normale necomprimate). Dar acum sunt deja produse plăci video cu 512 megabytes de memorie locală, lățimea sa de bandă este în continuă creștere, metodele de compresie au fost dezvoltate special pentru hărțile normale, astfel încât aceste mici restricții nu sunt de fapt foarte importante. Efectul cartografierii normale este mult mai mare, permițând utilizarea modelelor relativ scăzute din poli, reducând cerințele de memorie pentru stocarea datelor geometrice, îmbunătățind performanța și oferind un rezultat vizual foarte decent.

Cartografiere paralelă / Cartografiere offset

Cartarea normală, dezvoltată în 1984, a fost urmată de Relief Texture Mapping, introdusă de Olivera și Bishop în 1999. Este o tehnică de cartografiere a texturilor bazată pe informații de profunzime. Metoda nu a găsit aplicație în jocuri, dar ideea sa a contribuit la continuarea lucrărilor de cartografiere a paralaxei și la îmbunătățirea acesteia. Kaneko a introdus cartografierea paralaxei în 2001, care a fost prima metodă eficientă de a efectua efectul de paralaxă pe pixeli. În 2004, Welsh a demonstrat utilizarea mapării de paralaxă pe cipurile video programabile.

Această metodă are probabil cele mai diferite nume. Voi enumera cele pe care le-am întâlnit: Cartografiere paralaxă, Cartografiere offset, Cartografiere virtuală a deplasării, Cartografiere deplasare pe pixeli. Primul titlu este folosit în articol pentru concizie.
Cartarea Parallax este o altă alternativă la cartografierea cu bump și tehnicile normale de cartografiere, care vă oferă și mai multă perspectivă asupra detaliilor suprafeței, o afișare mai naturală a suprafețelor 3D, fără a pierde prea multă performanță. Această tehnică este similară atât cu cartarea deplasării, cât și cu cartarea normală în același timp, este undeva între ele. Metoda este, de asemenea, concepută pentru a afișa mai multe detalii de suprafață decât modelul geometric original. Este similar cu cartarea normală, dar diferența este că metoda distorsionează cartarea texturii prin schimbarea coordonatelor texturii astfel încât, atunci când privim suprafața din unghiuri diferite, să pară convexă, deși în realitate suprafața este plană și nu se schimbă . Cu alte cuvinte, Parallax Mapping este o tehnică pentru aproximarea efectului de deplasare a punctelor de suprafață în funcție de o modificare a punctului de vedere.

Tehnica deplasează coordonatele texturii (motiv pentru care tehnica este uneori numită mapare offset), astfel încât suprafața să arate mai voluminoasă. Ideea din spatele metodei este de a returna coordonatele texturii punctului în care vectorul de vedere intersectează suprafața. Acest lucru necesită trasarea razelor (ray tracing) pentru înălțimea hărții, dar dacă nu are prea multe valori variabile („netedă” sau „netedă”), atunci se poate renunța la aproximare. Această metodă este bună pentru suprafețe cu înălțimi care variază ușor, fără calcularea greșită a intersecțiilor și a valorilor mari ale decalajului. Un astfel de algoritm simplu diferă de cartografierea normală, cu doar trei instrucțiuni de pixel shader: două instrucțiuni matematice și o extragere suplimentară din textură. După calcularea noii coordonate de textură, este folosită în continuare pentru a citi alte straturi de textură: textura de bază, harta normală etc. Această metodă de cartografiere în paralelă pe cipurile video moderne este aproape la fel de eficientă ca și cartografierea texturilor convenționale, iar rezultatul acesteia este o afișare a suprafeței mai realistă decât cartografia simplă normală.

Dar utilizarea cartării paralaxei convenționale este limitată la hărțile de înălțime cu diferențe mici de valori. Neregulile „abrupte” sunt procesate incorect de algoritm, apar diverse artefacte, texturi „plutitoare” etc. Au fost dezvoltate mai multe metode modificate pentru a îmbunătăți tehnica de mapare a paralaxei. Mai mulți cercetători (Yerex, Donnelly, Tatarchuk, Policarpo) au descris noi metode care îmbunătățesc algoritmul inițial. Aproape toate ideile se bazează pe urmărirea razelor într-un pixel shader pentru a determina intersecția detaliilor suprafeței între ele. Tehnicile modificate au primit mai multe nume diferite: Cartografiere paralaxă cu ocluzie, Cartografiere paralaxă cu funcții la distanță, Cartografiere ocluzie paralelă. Pentru scurtă durată, îi vom numi pe toți Parallax Occlusion Mapping.

Metodele Parallax Oclusion Mapping includ, de asemenea, trasarea razelor pentru a determina înălțimile și pentru a ține seama de vizibilitatea textilelor. Într-adevăr, atunci când sunt priviți la un unghi față de suprafață, texelele se blochează reciproc și, având în vedere acest lucru, puteți adăuga mai multă adâncime efectului de paralaxă. Imaginea rezultată devine mai realistă și astfel de metode îmbunătățite pot fi utilizate pentru relief mai profund, este excelentă pentru descrierea pereților de cărămidă și piatră, trotuare etc. toate pe pixel, și nu superficiale. Acesta este motivul pentru care metoda are nume precum Cartarea deplasării virtuale și Cartografia deplasării pe pixeli. Uită-te la imagine, este greu de crezut, dar pietrele pavajului sunt doar un efect pixel cu pixel:

Metoda vă permite să afișați în mod eficient suprafețe detaliate fără milioanele de vârfuri și triunghiuri care ar fi necesare atunci când implementați această geometrie. În același timp, se păstrează detalii ridicate (cu excepția siluetelor / muchiilor), iar calculele animației sunt mult simplificate. Această tehnică este mai ieftină decât utilizarea geometriei reale și se utilizează semnificativ mai puține poligoane, mai ales în cazurile cu detalii foarte mici. Există multe aplicații pentru algoritm și este cel mai potrivit pentru pietre, cărămizi și altele asemenea.

De asemenea, un avantaj suplimentar este că hărțile de înălțime se pot schimba dinamic (suprafața apei cu valuri, găuri de gloanțe în pereți și multe altele). Dezavantajul metodei este lipsa unor siluete geometrice corecte (muchiile obiectului), deoarece algoritmul este pixel cu pixel și nu este o cartografiere reală a deplasării. Dar economisește performanța sub formă de sarcină redusă la transformare, iluminare și animație a geometriei. Salvează memoria video necesară pentru a stoca volume mari de date geometrice. Avantajele tehnicii sunt integrarea relativ simplă în aplicațiile existente și utilizarea utilităților familiare utilizate pentru cartografierea normală în proces.

Tehnica a fost deja utilizată în jocurile reale din vremurile recente. Până în prezent, se descurcă cu o cartografiere simplă de paralaxă bazată pe hărți statice de înălțime, fără urmărirea razelor și calcularea intersecțiilor. Iată câteva exemple despre modul în care harta de paralaxă poate fi utilizată în jocuri:

Post procesare

În sens larg, post-procesarea este tot ceea ce se întâmplă după pașii principali de imagistică. Cu alte cuvinte, post-procesarea reprezintă orice modificare a unei imagini după ce a fost redată. Postprocesarea este un set de instrumente pentru crearea de efecte vizuale speciale, iar crearea lor se realizează după ce se realizează lucrarea principală de redare a scenei, adică la crearea efectelor de postprocesare se folosește o hartă de biți gata.

Un exemplu simplu dintr-o fotografie: ați fotografiat un lac frumos cu verdeață pe vreme senină. Cerul este foarte luminos, iar copacii sunt prea întunecați. Încărcați fotografia într-un editor grafic și începeți să modificați luminozitatea, contrastul și alți parametri pentru zonele imaginii sau pentru întreaga imagine. Dar nu mai aveți ocazia să modificați setările camerei, faceți procesarea imaginii terminate. Aceasta este post-procesare. Sau un alt exemplu: selectarea unui fundal în fotografia de portret și aplicarea unui filtru de estompare acelei zone pentru un efect de adâncime de câmp cu adâncime mai mare. Adică, atunci când modificați sau corectați un cadru într-un editor grafic, faceți post-procesare. La fel se poate face și în joc, în timp real.

Există multe posibilități diferite pentru procesarea imaginilor după redare. Toată lumea a văzut probabil o mulțime de așa-numitele filtre grafice în editorii grafici. Aceasta este exact ceea ce se numește postfiltre: estompare, detectare margini, ascuțire, zgomot, netezire, relief, etc. Când se aplică redării 3D în timp real, acest lucru se face astfel - întreaga scenă este redată într-o zonă specială, redarea țintă și după redarea principală, această imagine este procesată suplimentar folosind pixel shaders și este afișată doar pe ecran. Dintre efectele de post-procesare din jocuri, cele mai frecvent utilizate sunt ,,. Există multe alte efecte post: zgomot, flare, distorsiune, sepia etc.

Iată câteva exemple prime de post-procesare în aplicații de jocuri:

Gama dinamică ridicată (HDR)

Gama dinamică ridicată (HDR), aplicată graficii 3D, este o redare a gamei dinamice ridicate. Esența HDR este de a descrie intensitatea și culoarea cu cantități fizice reale. Modelul obișnuit pentru descrierea unei imagini este RGB, când toate culorile sunt reprezentate ca suma culorilor primare: roșu, verde și albastru, cu intensități diferite sub forma unor valori întregi posibile de la 0 la 255 pentru fiecare, codate cu opt biți pe culoare. Raportul dintre intensitatea maximă și cea minimă care poate fi afișat de un anumit model sau dispozitiv se numește interval dinamic. Deci, intervalul dinamic al modelului RGB este 256: 1 sau 100: 1 cd / m 2 (două ordine de mărime). Acest model pentru descrierea culorii și intensității este denumit în mod obișnuit Gama dinamică redusă (LDR).

Valorile LDR posibile pentru toate cazurile nu sunt în mod clar suficiente, o persoană este capabilă să vadă o gamă mult mai mare, în special la o intensitate redusă a luminii, iar modelul RGB este prea limitat în astfel de cazuri (și la intensități mari). Gama dinamică a viziunii umane este cuprinsă între 10-6 și 10 8 cd / m 2, adică 10.000.000.000.000: 1 (14 ordine de mărime). Nu putem vedea întregul interval în același timp, dar intervalul vizibil ochiului în fiecare moment este aproximativ egal cu 10.000: 1 (patru ordine de mărime). Viziunea se adaptează treptat la valorile din altă parte a gamei de iluminare, folosind așa-numita adaptare, care poate fi descrisă cu ușurință printr-o situație cu oprirea luminii într-o cameră noaptea - la început ochii văd foarte puțin, dar de-a lungul timpului, ei se adaptează la condițiile de iluminare modificate și văd mult mai mult ... Același lucru se întâmplă atunci când schimbați mediul întunecat înapoi la unul luminos.

Deci, intervalul dinamic al modelului de descriere RGB nu este suficient pentru a reprezenta imagini pe care o persoană le poate vedea în realitate, acest model reduce semnificativ valorile posibile ale intensității luminii în părțile superioare și inferioare ale intervalului. Cel mai frecvent exemplu citat în materialele HDR este imaginea unei camere întunecate cu o fereastră pe o stradă luminoasă într-o zi însorită. Cu un model RGB, puteți obține fie o afișare normală a ceea ce este în afara ferestrei, fie doar ceea ce este în interiorul camerei. Valorile mai mari de 100 cd / m 2 în LDR sunt în general decupate, motiv pentru care este dificil în redarea 3D să se afișeze corect sursele de lumină puternică direcționate direct în cameră.

Până în prezent, dispozitivele de afișare a datelor în sine nu pot fi îmbunătățite în mod serios și are sens să abandonezi LDR în calcule, poți folosi valori fizice reale de intensitate și culoare (sau proporțional liniar) și să afișezi maximul pe monitor. Esența reprezentării HDR constă în utilizarea valorilor de intensitate și culoare în mărimi fizice reale sau proporționale liniar și în utilizarea nu a numărului întreg, ci a numerelor cu virgulă mobilă cu precizie ridicată (de exemplu, 16 sau 32 de biți). Aceasta elimină limitările modelului RGB și mărește dramatic gama dinamică a imaginii. Dar apoi orice imagine HDR poate fi afișată pe orice mediu de afișare (același monitor RGB), cu cea mai înaltă calitate posibilă pentru aceasta utilizând algoritmi speciali.

Redarea HDR vă permite să modificați expunerea după ce am redat imaginea. Face posibilă simularea efectului adaptării viziunii umane (trecerea de la spații deschise luminoase la camere întunecate și invers), permite iluminarea corectă din punct de vedere fizic și este, de asemenea, o soluție unificată pentru aplicarea efectelor de post-procesare (strălucire, flare, înflorire , neclaritate de miscare). Algoritmii de procesare a imaginilor, corecția culorilor, corecția gamma, neclaritatea mișcării, înflorirea și alte metode de post-procesare sunt mai bine realizate în reprezentarea HDR.

În aplicațiile de redare 3D în timp real (jocuri, în principal), redarea HDR a început să fie utilizată nu cu mult timp în urmă, deoarece necesită calcule și suport pentru o țintă de redare în formate în virgulă mobilă, care au devenit mai întâi disponibile doar pe cipurile video cu suport pentru DirectX 9. Modul obișnuit de redare HDR în jocuri: redarea unei scene într-un buffer în virgulă mobilă, post-procesare a unei imagini într-o gamă extinsă de culori (schimbarea contrastului și luminozității, echilibrului culorilor, efectelor de strălucire și mișcare, efectului de flare al obiectivului și asemănător), aplicând maparea tonurilor pentru a afișa imaginea HDR finală pe dispozitivul de afișare LDR. Uneori hărțile de mediu sunt folosite în formatele HDR, pentru reflecții statice asupra obiectelor, utilizarea HDR în simularea refracțiilor dinamice și a reflexiilor este foarte interesantă, pentru aceasta pot fi folosite și hărți dinamice în formate în virgulă mobilă. La aceasta puteți adăuga mai multe hărți ușoare, calculate în avans și salvate în format HDR. O mare parte din cele de mai sus a fost făcută, de exemplu, în Half-Life 2: Lost Coast.

Redarea HDR este foarte utilă pentru postprocesarea complexă de calitate superioară decât metodele convenționale. Aceeași floare va arăta mai realistă atunci când este calculată în modelul de vizualizare HDR. De exemplu, așa cum se face în jocul Cry Cry de la Far Crytek, folosește tehnici standard de redare HDR: aplicarea filtrelor de înflorire furnizate de Kawase și operatorul de cartografiere a tonurilor Reinhard.

Din păcate, în unele cazuri, dezvoltatorii de jocuri pot ascunde sub numele HDR doar un filtru de înflorire calculat în gama obișnuită LDR. Și, deși cea mai mare parte a ceea ce se face în jocurile cu redare HDR chiar acum este o înflorire de calitate mai bună, beneficiile redării HDR nu se limitează la acest post-efect, este doar cel mai ușor de făcut.

Alte exemple de redare HDR în aplicații în timp real:


Maparea tonurilor este procesul de conversie a unui interval de luminanță HDR în gama LDR afișată de un dispozitiv de ieșire, cum ar fi un monitor sau o imprimantă, deoarece pentru a le transmite imagini HDR va fi necesară conversia gamei dinamice și a gamei modelului HDR în dinamica LDR corespunzătoare. gama, cel mai frecvent RGB. La urma urmei, gama de luminozitate prezentată în HDR este foarte largă, este de câteva ordine de mărime a gamei dinamice absolute la un moment dat, într-o singură scenă. Iar intervalul care poate fi reprodus pe dispozitivele de ieșire convenționale (monitoare, televizoare) este de numai două ordine de mărime a intervalului dinamic.

Conversia HDR în LDR se numește mapare a tonurilor și are pierderi și imită proprietățile vederii umane. Acești algoritmi sunt denumiți în mod obișnuit declarații de mapare a tonurilor. Operatorii clasifică toate valorile luminozității imaginii în trei tipuri diferite: întunecat, mediu și luminos. Pe baza evaluării luminozității tonurilor medii, iluminarea generală este corectată, valorile de luminozitate ale pixelilor din scenă sunt redistribuite pentru a intra în intervalul de ieșire, pixelii întunecați sunt luminați și cei luminoși sunt întunecați. Apoi, cei mai strălucitori pixeli din imagine sunt redimensionați la intervalul dispozitivului de ieșire sau al modelului de vizualizare a ieșirii. Următoarea imagine arată cea mai simplă conversie a unei imagini HDR în gama LDR, o transformare liniară și un operator de cartografiere a tonurilor mai complex este aplicat fragmentului din centru, care funcționează așa cum este descris mai sus:

Se poate observa că numai cu ajutorul mapării neliniare a tonurilor puteți obține maximum de detalii în imagine și, dacă aduceți HDR la LDR liniar, atunci multe lucruri mici se pierd pur și simplu. Nu există un singur algoritm corect de cartografiere a tonurilor, există mai mulți operatori care dau rezultate bune în diferite situații. Iată un bun exemplu de două afirmații diferite de mapare a tonurilor:

Împreună cu redarea HDR, maparea tonurilor a fost recent utilizată în jocuri. A devenit posibilă simularea opțională a proprietăților viziunii umane: pierderea clarității în scenele întunecate, adaptarea la noile condiții de iluminare în timpul tranzițiilor de la zone foarte luminoase la zone întunecate și invers, sensibilitate la schimbările de contrast, culoare ... Așa se face imitația capacității viziunii de a se adapta în Far Cry arată. Prima captură de ecran arată imaginea pe care jucătorul o vede doar transformându-se dintr-o cameră întunecată într-un spațiu deschis puternic luminat, iar a doua arată aceeași imagine la câteva secunde după adaptare.

a inflori

Bloom este unul dintre efectele cinematice de post-procesare care luminează cele mai strălucitoare părți ale unei imagini. Acesta este efectul luminii foarte puternice, care apare ca o strălucire în jurul suprafețelor luminoase, după aplicarea filtrului de înflorire, astfel de suprafețe nu primesc doar o luminozitate suplimentară, lumina de la acestea (halou) afectează parțial zonele mai întunecate adiacente suprafețelor luminoase din rama. Cel mai simplu mod de a arăta acest lucru este cu un exemplu:

În grafica 3D Bloom, filtrul se realizează folosind post-procesare suplimentară - amestecând un cadru neclar de filtrul de estompare (întregul cadru sau zonele sale luminoase individuale, filtrul se aplică de obicei de mai multe ori) și cadrul original. Unul dintre cei mai frecvent utilizați algoritmi de post-filtrare bloom în jocuri și alte aplicații în timp real:

  • Scena este redată într-un framebuffer, intensitatea strălucirii obiectelor este scrisă pe canalul alfa al bufferului.
  • Framebuffer-ul este copiat într-o textură specială pentru procesare.
  • Rezoluția texturii este redusă, de exemplu, cu un factor de 4.
  • Filtrele antialiasing (neclaritate) sunt aplicate imaginii de mai multe ori, pe baza datelor de intensitate înregistrate în canalul alfa.
  • Imaginea rezultată este amestecată cu cadrul original din framebuffer și rezultatul este afișat pe ecran.

La fel ca alte tipuri de post-procesare, bloom este cel mai bine utilizat atunci când se redează în interval dinamic ridicat (HDR). Exemple suplimentare de procesare a imaginii finale printr-un filtru bloom din aplicații 3D în timp real:

Neclaritate de miscare

Încețoșarea de mișcare apare în fotografii și filme datorită mișcării obiectelor în cadru în timpul expunerii cadrului, în timp ce obturatorul obiectivului este deschis. Un cadru realizat de o cameră (fotografie, film) nu arată un instantaneu realizat instantaneu cu durată zero. Datorită limitărilor tehnologice, cadrul arată o anumită perioadă de timp, timp în care obiectele din cadru se pot deplasa la o anumită distanță și, dacă se întâmplă acest lucru, vor fi prezentate toate pozițiile obiectului în mișcare în timpul obturatorului deschis al obiectivului. pe cadru ca o imagine neclară de-a lungul vectorului de mișcare ... Acest lucru se întâmplă dacă obiectul se mișcă în raport cu camera sau camera este relativă cu obiectul, iar cantitatea de neclaritate ne oferă o idee despre magnitudinea vitezei de mișcare a obiectului.

În animația tridimensională, în orice moment dat (cadru), obiectele sunt situate la anumite coordonate în spațiul tridimensional, similar cu o cameră virtuală cu o viteză de declanșare infinit de rapidă. Ca urmare, nu există o estompare similară cu cea obținută de cameră și de ochiul uman atunci când se uită la obiecte în mișcare rapidă. Pare nefiresc și nerealist. Luați în considerare un exemplu simplu: mai multe sfere se rotesc în jurul unor axe. Iată o imagine a modului în care ar arăta această mișcare cu și fără estompare:

Dintr-o imagine fără estompare, nu se poate spune chiar dacă sferele se mișcă sau nu, în timp ce estomparea de mișcare oferă o idee clară despre viteza și direcția de mișcare a obiectelor. Apropo, lipsa de estompare a mișcării este, de asemenea, motivul pentru care mișcarea în jocuri cu 25-30 de cadre pe secundă pare sacadată, deși filmele și videoclipurile arată grozav la aceiași parametri ai ratei de cadre. Pentru a compensa lipsa de estompare a mișcării, este de dorit fie o rată de cadre ridicată (60 de cadre pe secundă sau mai mare), fie utilizarea unor metode suplimentare de procesare a imaginii pentru a emula efectul estompării de mișcare. Aceasta este utilizată pentru a îmbunătăți fluiditatea animației și pentru efectul realismului foto și film în același timp.

Cel mai simplu algoritm de estompare a mișcării pentru aplicațiile în timp real este acela de a utiliza date din cadre de animație anterioare pentru a reda cadrul curent. Dar există, de asemenea, metode de estompare a mișcării mai eficiente și mai moderne, care nu utilizează cadre anterioare, dar se bazează pe vectorii de mișcare ai obiectelor din cadru, adăugând, de asemenea, doar o etapă de post-procesare la procesul de redare. Efectul de estompare poate fi fie pe ecran complet (de obicei realizat în post-procesare), fie pentru obiecte individuale, care se mișcă cel mai rapid.

Aplicații posibile ale efectului de estompare a mișcării în jocuri: toate jocurile de curse (pentru a crea efectul unei viteze foarte mari de mișcare și pentru a fi utilizate la vizionarea reluărilor de tip TV), jocuri sportive (aceleași reluări și în jocul în sine, să fie aplicat obiectelor cu mișcare foarte rapidă, cum ar fi o minge sau un puck), jocuri de luptă (mișcări rapide ale armelor corpului, brațelor și picioarelor), multe alte jocuri (în timpul scenelor 3D în joc ale motorului). Iată câteva exemple de efecte de post motion blur post din jocuri:

Adâncimea câmpului (DOF)

Adâncimea de câmp, pe scurt, este estomparea obiectelor în funcție de poziția lor față de focalizarea camerei. În viața reală, în fotografii și în filme, nu vedem toate obiectele la fel de clar, acest lucru se datorează particularității structurii ochiului și structurii opticii camerelor și a camerelor de cinema. Optica foto și cinematografică are o anumită distanță, obiectele situate la o astfel de distanță de cameră sunt focalizate și arată clar în imagine, iar obiectele mai îndepărtate de cameră sau aproape de ea, dimpotrivă, par neclare, claritatea scade treptat cu distanță crescătoare sau descrescătoare ...

După cum ați fi putut ghici, aceasta este o fotografie, nu o redare. În grafica computerizată, fiecare obiect al imaginii redate este perfect clar, deoarece obiectivele și optica nu sunt imitate în calcule. Prin urmare, pentru a realiza realismul foto și cinematografic, trebuie folosiți algoritmi speciali pentru a face ceva similar pentru grafica computerizată. Aceste tehnici simulează efectul unei focalizări diferite asupra obiectelor la distanțe diferite.

Una dintre tehnicile obișnuite pentru redarea în timp real este de a amesteca cadrul original și versiunea sa neclară (treceri multiple ale filtrului de estompare) pe baza datelor de adâncime pentru pixelii din imagine. În jocuri, efectul DOF are mai multe utilizări, de exemplu, scene de joc pe motorul jocului, reluări în jocuri sportive și de curse. Exemple de adâncime de câmp în timp real:

Nivelul de detaliu (LOD)

Nivelul de detaliu în aplicațiile 3D este o metodă de reducere a complexității redării unui cadru, reducerea numărului total de poligoane, texturi și alte resurse într-o scenă și, în general, reducerea complexității acestuia. Un exemplu simplu: modelul personajului principal este format din 10.000 de poligoane. În cazurile în care se află aproape de cameră în scena procesată, este important să se utilizeze toate poligoanele, dar la o distanță foarte mare de cameră, acesta va ocupa doar câțiva pixeli în imaginea finală și nu există punct în procesarea tuturor celor 10.000 de poligoane. Poate că, în acest caz, sute de poligoane, sau chiar câteva poligoane și o textură special pregătită vor fi suficiente pentru aproximativ aceeași afișare a modelului. În consecință, la distanțe medii, este logic să folosiți un model format din mai multe triunghiuri decât cel mai simplu model și mai puțin decât cel mai complex.

Metoda LOD este de obicei utilizată la modelarea și redarea scenelor 3D, folosind mai multe niveluri de complexitate (geometrice sau de altă natură) pentru obiecte, proporțional cu distanța de la acestea la cameră. Tehnica este adesea utilizată de dezvoltatorii de jocuri pentru a reduce numărul de poligoane dintr-o scenă și pentru a îmbunătăți performanța. Când sunt amplasate aproape de cameră, sunt folosite modele cu maximum de detalii (numărul de triunghiuri, dimensiunea texturilor, complexitatea texturării), pentru o calitate a imaginii cât mai mare posibil și invers, atunci când modelele sunt scoase din cameră , modelele cu mai puține triunghiuri sunt utilizate pentru a crește viteza de redare. Schimbarea complexității, în special a numărului de triunghiuri din model, poate avea loc automat pe baza unui model 3D de complexitate maximă sau poate pe baza mai multor modele pre-pregătite cu niveluri diferite de detaliu. Prin utilizarea modelelor cu mai puține detalii pentru diferite distanțe, complexitatea de redare estimată este redusă, cu aproape nicio deteriorare a detaliului general al imaginii.

Metoda este deosebit de eficientă dacă numărul obiectelor din scenă este mare și sunt situate la distanțe diferite de cameră. De exemplu, luați un joc sportiv, cum ar fi un simulator de hochei sau fotbal. Modelele cu caractere low poly sunt folosite atunci când sunt departe de cameră, iar la mărire, modelele sunt înlocuite de altele cu un număr mare de poligoane. Acest exemplu este foarte simplu și arată esența metodei bazate pe două niveluri de detalii ale modelului, dar nimeni nu se deranjează să creeze mai multe niveluri de detaliu, astfel încât efectul schimbării nivelului LOD să nu fie prea vizibil, astfel încât detaliile să fie treptate „crește” pe măsură ce obiectul se apropie.

În plus față de distanța față de cameră, pot fi importanți și alți factori pentru LOD - numărul total de obiecte de pe ecran (atunci când unul sau două caractere sunt în cadru, sunt utilizate modele complexe și când 10-20, ele se schimbă la cele mai simple) sau numărul de cadre pe secundă (sunt stabilite limitele valorilor FPS, la care se modifică nivelul detaliilor, de exemplu, la FPS sub 30 reducem complexitatea modelelor de pe ecran și la 60, dimpotrivă, crește). Alți factori posibili care afectează nivelul de detaliu sunt viteza de mișcare a obiectului (cu greu veți avea timp să luați în considerare o rachetă în mișcare, dar puteți vedea cu ușurință un melc), importanța personajului din punct de vedere al jocului ( luați același fotbal - pentru modelul jucătorului pe care îl controlați, puteți utiliza geometrie și texturi mai complexe, îl vedeți cel mai aproape și cel mai des). Totul depinde de dorințele și capacitățile unui anumit dezvoltator. Principalul lucru nu este să exagerați, schimbările frecvente și vizibile ale nivelului de detaliu sunt enervante.

Permiteți-mi să vă reamintesc că nivelul de detaliu nu se referă neapărat doar la geometrie, metoda poate fi folosită și pentru a economisi alte resurse: la texturare (deși cipurile video folosesc deja mipmapping, uneori este logic să schimbați texturile din mers pe altele cu diferite detalii), tehnici de iluminare (obiectele apropiate sunt iluminate conform unui algoritm complex, iar cele îndepărtate - în conformitate cu unul simplu), tehnica de texturare (cartarea paralaxă complexă este utilizată pe suprafețe apropiate, iar cartografierea normală este utilizată pe suprafețe îndepărtate) , etc.

Nu este atât de ușor să arăți un exemplu din joc, pe de o parte, într-o oarecare măsură, LOD este utilizat în aproape fiecare joc, pe de altă parte, nu este întotdeauna posibil să se arate clar acest lucru, altfel nu ar avea prea mult rost în LOD în sine.

Dar în acest exemplu, este încă clar că cel mai apropiat model de mașină are detalii maxime, următoarele două sau trei mașini sunt, de asemenea, foarte aproape de acest nivel și toate cele îndepărtate au simplificări vizibile, iată doar cele mai semnificative: există fără oglinzi retrovizoare, plăcuțe de înmatriculare, ștergătoare de parbriz etc. echipament de iluminare suplimentar. Și de la cel mai îndepărtat model nu există nici măcar o umbră pe drum. Acesta este nivelul algoritmului de detaliu în acțiune.

Iluminare globală

Este dificil să simulăm iluminarea realistă a scenei, fiecare rază de lumină din realitate este reflectată și refractată în mod repetat, numărul acestor reflexii nu este limitat. Și în redarea 3D, numărul de reflexii depinde puternic de capacitățile de proiectare, orice calcul de scenă este un model fizic simplificat, iar imaginea rezultată este aproape de realism.

Algoritmii de iluminare pot fi împărțiți în două modele: iluminare directă sau locală și iluminare globală (iluminare directă sau locală și iluminare globală). Modelul de iluminare locală folosește calculul iluminării directe, lumina de la sursele de lumină la prima intersecție a luminii cu o suprafață opacă, interacțiunea obiectelor între ele nu este luată în considerare. Deși acest model încearcă să compenseze acest lucru prin adăugarea de fundal sau de iluminare uniformă (ambientală), aceasta este cea mai simplă aproximare, o iluminare extrem de simplificată din toate razele indirecte ale surselor de lumină, care specifică culoarea și intensitatea iluminării obiectelor în absența surse de lumină directă.

Aceeași trasare a razelor calculează iluminarea suprafețelor numai prin raze directe din surse de lumină și orice suprafață, pentru a fi vizibilă, trebuie să fie iluminată direct de o sursă de lumină. Acest lucru nu este suficient pentru a obține rezultate fotorealiste, pe lângă iluminarea directă, este necesar să se ia în considerare iluminarea secundară prin raze reflectate de pe alte suprafețe. În lumea reală, razele de lumină sunt reflectate de pe suprafețe de mai multe ori până când sunt complet stinse. Lumina soarelui care trece printr-o fereastră luminează întreaga cameră, deși razele nu pot ajunge direct pe toate suprafețele. Cu cât sursa de lumină este mai strălucitoare, cu atât mai multe ori vor fi reflectate. Culoarea suprafeței reflectorizante afectează și culoarea luminii reflectate, de exemplu un perete roșu va provoca o pată roșie pe un obiect alb adiacent. Iată o diferență clară, calculul fără și luând în considerare iluminarea secundară:

În modelul de iluminare globală, iluminarea globală, iluminarea se calculează ținând seama de influența obiectelor reciproc, sunt luate în considerare multiple reflexii și refracții ale razelor de lumină de pe suprafețele obiectelor, caustice și împrăștierea subterană. Acest model vă permite să obțineți o imagine mai realistă, dar complică procesul, necesitând semnificativ mai multe resurse. Există mai mulți algoritmi de iluminare globală, vom analiza rapid radiositatea (calculul iluminării indirecte) și maparea fotonilor (calculul iluminării globale bazat pe hărțile fotonice precalculate folosind urmărirea). Există, de asemenea, metode simplificate pentru simularea iluminării indirecte, cum ar fi schimbarea luminozității generale a unei scene în funcție de numărul și luminozitatea surselor de lumină din ea sau utilizarea unui număr mare de lumini punctuale plasate în jurul scenei pentru a simula lumina reflectată, dar totuși acest lucru este departe de a fi un algoritm real. GI.

Algoritmul de radiositate este procesul de calcul al reflecțiilor secundare ale razelor de lumină de la o suprafață la alta, precum și de la mediu la obiecte. Razele de la sursele de lumină sunt urmărite până când puterea lor scade sub un anumit nivel sau razele ating un anumit număr de reflexii. Aceasta este o tehnică GI obișnuită, calculele se fac de obicei înainte de redare, iar rezultatele calculului pot fi utilizate pentru redarea în timp real. Ideile de bază ale radiosității se bazează pe fizica transferului de căldură. Suprafețele obiectelor sunt împărțite în zone mici numite patch-uri și se presupune că lumina reflectată este împrăștiată uniform în toate direcțiile. În loc să se calculeze fiecare fascicul pentru lumini, se folosește o tehnică de mediere, împărțind luminile în patch-uri pe baza nivelurilor de energie pe care le produc. Această energie este distribuită proporțional între petele de suprafață.

O altă metodă de calcul al iluminării globale, propusă de Henrik Wann Jensen, este metoda de mapare a fotonilor. Hărțile fotonice sunt un alt algoritm de iluminare globală trasat de raze folosit pentru a simula modul în care razele de lumină interacționează cu obiectele dintr-o scenă. Algoritmul calculează reflexii secundare ale razelor, refracția luminii prin suprafețe transparente, reflexii împrăștiate. Această metodă constă în calcularea iluminării punctelor de pe suprafață în două treceri. Primul este urmărirea directă a razelor de lumină cu reflecții secundare, acesta este un proces preliminar care se efectuează înainte de redarea principală. Această metodă calculează energia fotonilor care merg de la sursa de lumină la obiectele din scenă. Când fotonii ajung la suprafață, punctul de intersecție, direcția și energia fotonului sunt stocate într-un cache numit hartă fotonică. Hărțile fotonice pot fi salvate pe disc pentru utilizare ulterioară, astfel încât să nu fie redate fiecare cadru. Reflecțiile fotonilor sunt calculate până când lucrarea se oprește după un anumit număr de reflexii sau când se ajunge la o anumită energie. În cea de-a doua trecere de redare, se calculează iluminarea pixelilor de scenă cu raze directe, ținând cont de datele stocate în hărțile fotonice, energia fotonului se adaugă la energia iluminării directe.

Calculele de iluminare globală care utilizează un număr mare de reflecții secundare durează mult mai mult decât calculele de iluminare directă. Există tehnici pentru calculul hardware al unui oraș radio în timp real, care utilizează capacitățile ultimelor generații de cipuri video programabile, dar deocamdată scenele pentru care se calculează iluminarea globală în timp real ar trebui să fie destul de simple și se fac multe simplificări în algoritmi.

Dar ceea ce se folosește de multă vreme este iluminarea globală statică precalculată, care este acceptabilă pentru scene fără a schimba poziția surselor de lumină și a obiectelor mari care afectează puternic iluminarea. La urma urmei, calculul iluminării globale nu depinde de poziția observatorului și dacă poziția acestor obiecte în scenă și parametrii surselor de iluminare nu se modifică în scenă, atunci valorile de iluminare calculate anterior pot fi fi folosit. Aceasta este utilizată în multe jocuri, stocând datele de calcul GI sub formă de lightmaps.

Există, de asemenea, algoritmi acceptabili pentru simularea iluminării globale în dinamică. De exemplu, există o metodă atât de simplă de utilizat în aplicații în timp real pentru a calcula iluminarea indirectă a unui obiect dintr-o scenă: redarea simplificată a tuturor obiectelor cu detalii reduse (cu excepția celei pentru care se calculează iluminarea) într-un nivel scăzut -harta cubului de rezoluție (poate fi folosită și pentru afișarea reflexiilor dinamice pe suprafața obiectului), apoi filtrarea acestei texturi (mai multe treceri ale filtrului de estompare) și aplicarea datelor din textura calculată pentru a ilumina acest obiect ca o completare directă iluminat. În cazurile în care calculul dinamic este prea greu, se pot renunța la hărțile de radiositate statice. Un exemplu din jocul MotoGP 2, care arată în mod clar efectul benefic chiar și al unei astfel de simple imitații a GI:



"itemprop =" imagine ">

- Ce sunt umbrele? Este o întrebare foarte frecventă a jucătorilor curioși și a dezvoltatorilor de jocuri începători. În acest articol vă voi spune despre aceste umbrere teribile într-un mod lucid și de înțeles.

Consider că jocurile pe computer sunt motorul progresului către imagini fotorealiste în grafica pe computer, așa că hai să vorbim despre ceea ce sunt „umbrele” în contextul jocurilor video.

Înainte de apariția primelor acceleratoare grafice, toată munca de redare a cadrelor de jocuri video a fost făcută de săracul procesor central.

Desenarea unui cadru este de fapt o treabă destul de obișnuită: trebuie să luați „geometrie” - modele poligonale (lume, personaj, armă etc.) și să o rasterizați. Ce este Rasterize? Întregul model 3d constă din cele mai mici triunghiuri, pe care rasterizatorul le transformă în pixeli (adică „rasterizează” înseamnă transformarea în pixeli). După rasterizare, luați date de textură, parametri de iluminare, ceață etc. și calculați fiecare pixel rezultat al cadrului de joc, care va fi afișat jucătorului.

Deci, unitatea centrală de procesare (CPU - Central Processing Unit) este un tip prea inteligent pentru a-l face să facă o astfel de rutină. În schimb, este logic să alocăm un fel de modul hardware care descarcă CPU, astfel încât să poată face o muncă intelectuală mai importantă.

Un astfel de modul hardware este un accelerator grafic sau o placă video (GPU - Graphics Processing Unit). Acum procesorul pregătește date și încarcă un coleg cu lucrări de rutină. Având în vedere că GPU-ul nu este acum doar un coleg, este o mulțime de minioni-core, apoi se descurcă cu acest tip de lucru simultan.

Dar nu am primit încă un răspuns la întrebarea principală: Ce sunt umbrele? Stai, ajung la asta.

Frumos, interesant și aproape de grafica foto-realismului, a cerut dezvoltatorilor de plăci video să implementeze mulți algoritmi la nivel hardware. Umbre, lumini, lumini și așa mai departe. Această abordare - odată cu implementarea algoritmilor în hardware se numește „conductă fixă ​​sau conductă” și acolo unde este necesară o grafică de înaltă calitate, nu mai este găsită. Locul său a fost luat de conducta programabilă.

Cererile jucătorilor „hai, adu un graficon bun! surpriză! ”, au împins dezvoltatorii de jocuri (respectiv producătorii de plăci video) către algoritmi din ce în ce mai complexi. Până în prezent, la un moment dat, există prea puțini algoritmi hardware cu fir greu pentru ei.

Acum este momentul ca plăcile grafice să devină mai inteligente. Decizia a fost luată pentru a permite dezvoltatorilor să programeze blocuri GPU în conducte arbitrare care implementează diferiți algoritmi. Adică dezvoltatorii de jocuri, programatorii grafici au reușit acum să scrie programe pentru plăci video.

Și acum, în sfârșit, am ajuns la răspunsul la întrebarea noastră principală.

- Ce sunt umbrele?

Shader (engleză shader - shading program) este un program pentru o placă video care este utilizat în grafica tridimensională pentru a determina parametrii finali ai unui obiect sau imagine, poate include descrierea absorbției și împrăștierii luminii, cartografierea texturilor, reflecția și refracție, umbrire, deplasarea suprafeței etc. mulți alți parametri.

Ce sunt umbrele? De exemplu, puteți obține acest efect, acesta este un shader de apă aplicat pe o sferă.

Conductă grafică

Avantajul conductei programabile față de predecesorul său este că acum programatorii își pot crea proprii algoritmi și nu pot folosi un set de opțiuni cu cablu.

La început, plăcile video erau echipate cu mai multe procesoare specializate care acceptă diferite seturi de instrucțiuni. Shaders au fost împărțite în trei tipuri, în funcție de procesorul care le va executa. Dar apoi plăcile video au început să fie echipate cu procesoare universale care acceptă seturi de instrucțiuni pentru toate cele trei tipuri de umbrere. Împărțirea umbrelor în tipuri a fost păstrată pentru a descrie scopul umbrelor.

În plus față de sarcinile grafice cu astfel de plăci video inteligente, a devenit posibilă efectuarea de calcule generale (care nu au legătură cu grafica computerizată) pe GPU.

Pentru prima dată, suportul deplin pentru shadere a apărut în plăcile video din seria GeForce 3, dar rudimentele au fost implementate înapoi în GeForce256 (sub forma Combinatorilor de registre).

Tipuri de umbre

În funcție de stadiul conductei, umbrele sunt împărțite în mai multe tipuri: vârf, fragment (pixel) și geometric. Și în cele mai recente tipuri de conducte, există și umbrele de teselare. Nu vom discuta în detaliu conducta grafică, încă mă gândesc dacă să scriu un articol separat despre acest lucru, pentru cei care decid să studieze umbrele și programarea grafică. Scrieți în comentarii dacă vă interesează, voi ști dacă merită să pierdeți timpul.

Vertex shader

Umbrele de vertex fac animații de personaje, iarbă, copaci, creează valuri pe apă și multe alte lucruri. Într-un umbră de vârf, programatorul are acces la date legate de vârfuri, de exemplu: coordonatele unui vârf în spațiu, coordonatele texturii sale, culoarea și un vector normal.

Shader geometric

Umbrele geometrice sunt capabile să creeze o nouă geometrie și pot fi utilizate pentru a crea particule, pentru a modifica detaliile modelului din mers, pentru a crea siluete și multe altele. Spre deosebire de vârful anterior, acestea sunt capabile să proceseze nu numai un vârf, ci și un întreg primitiv. Primitivul poate fi un segment (două vârfuri) și un triunghi (trei vârfuri), iar dacă există informații despre vârfurile adiacente (adiacența engleză) pentru o primitivă triunghiulară, pot fi procesate până la șase vârfuri.

Pixel shader

Umbrele de pixeli realizează maparea texturilor, iluminarea și diferite efecte de textură, cum ar fi reflecția, refracția, ceața, Bump Mapping, etc. Umbrele de pixeli sunt, de asemenea, utilizate pentru efecte post.

Shader-ul de pixeli funcționează cu felii și texturi de bitmap - procesează date asociate pixelilor (de exemplu, culoare, adâncime, coordonate de textură). Shader-ul pixelilor este utilizat în ultima etapă a conductei grafice pentru a forma un fragment al unei imagini.

Ce scrie umbrele?

Inițial, umbrele puteau fi scrise într-un limbaj asamblator, dar mai târziu au existat limbaje shader la nivel înalt similare limbajului C, cum ar fi Cg, GLSL și HLSL.

Astfel de limbaje sunt mult mai simple decât C, deoarece sarcinile rezolvate cu ajutorul lor sunt mult mai simple. Sistemul de tip în astfel de limbi reflectă nevoile programatorilor grafici. Prin urmare, acestea oferă programatorului tipuri speciale de date: matrice, samplere, vectori etc.

RenderMan

Tot ce am discutat mai sus este legat de grafica în timp real. Dar există grafică non-realtime. Care este diferența - în timp real - în timp real, adică aici și acum - pentru a da 60 de cadre pe secundă în joc, acesta este un proces în timp real. Dar redarea unui cadru complex pentru animație de ultimă oră pentru câteva minute nu este în timp real. Esența este în timp.

De exemplu, nu putem obține grafică de o asemenea calitate ca în cele mai recente filme de animație ale studioului Pixar în timp real. Fermele de redare foarte mari calculează simulări de lumină folosind algoritmi complet diferiți, foarte scumpe, dar oferind imagini aproape fotorealiste.

Grafică super realistă în Sand piper

De exemplu, uită-te la acest desen animat drăguț, granule de nisip, pene de pasăre, valuri, totul pare incredibil de real.

* Videoclipurile pot fi interzise de pe Youtube, dacă nu se deschid, google pixar sandpiper - scurtul desen animat despre bravul sandpiper este foarte drăguț și pufos. Va atinge și va demonstra cât de grozavă poate fi grafica computerizată.

Deci, acesta este RenderMan de la Pixar. A devenit primul limbaj de programare shader. API-ul RenderMan este standardul de facto pentru randarea profesională și este utilizat în toate lucrările Pixar și nu numai.

Informatii utile

Acum știi ce sunt umbrele, dar pe lângă umbrele, există și alte subiecte foarte interesante în dezvoltarea jocurilor și grafica pe computer care te vor interesa cu siguranță:

  • este o tehnică pentru a crea efecte uimitoare în jocurile video moderne. Articol de prezentare generală și videoclipuri cu tutoriale despre crearea efectelor în Unity3d
  • - Dacă vă gândiți să dezvoltați jocurile video ca o carieră profesională sau un hobby, acest articol conține un set excelent de recomandări „de unde să începeți”, „ce cărți să citiți” etc.

Daca ai vreo intrebare

Ca de obicei, dacă mai aveți întrebări, puneți-le în comentarii, voi răspunde întotdeauna. Pentru orice cuvânt bun sau corectarea erorilor, aș fi foarte recunoscător.

Acest tutorial vă va ajuta să instalați umbrele în Minecraft și astfel să îmbunătățiți lumea jocului adăugând umbre dinamice, zgomot de vânt și iarbă, apă realistă și multe altele.

Trebuie remarcat imediat că umbrele încarcă sistemul destul de mult și, dacă aveți o placă video slabă sau chiar una integrată, vă recomandăm să nu vă instalați acest mod.

Instalarea constă din două etape, mai întâi trebuie să instalați modul pe umbrere, apoi pe pachete de umbră suplimentare

PASUL # 1 - Instalarea modului pentru umbrere

  1. Descărcați și instalați Java
  2. Instalare OptiFine HD
    sau ShadersMod;
  3. Despachetăm arhiva rezultată în orice loc;
  4. Rulați fișierul jar, deoarece este instalator;
  5. Programul vă va arăta calea către joc, dacă totul este corect, faceți clic pe Da, Ok, Ok;
  6. Mergi la .minecraftși creați un dosar acolo pachete de umbră;
  7. Intrăm în lansator și vedem în linie un profil nou cu numele „ShadersMod”, dacă nu, apoi îl selectăm manual.
  8. Apoi, trebuie să descărcați shaderpacks-urile

PASUL # 2 - Instalarea shaderpack-ului

  1. Descărcați shaderpack-ul care vă interesează (lista de la sfârșitul articolului)
  2. Apăsați tastele CÂȘTIGĂ + R
  3. Mergi la .minecraft / shaderpacks... Dacă nu există un astfel de folder, atunci creați-l.
  4. Mutați sau extrageți arhiva shader în .minecraft / shaderpacks... Calea ar trebui să arate astfel: .minecraft / shaderpacks / SHADER_FOLDER_NAME / shaders / fișierele [. fsh și .vsh din interior]
  5. Porniți Minecraft și mergeți Setări> Shaders... Aici veți vedea o listă a umbrelor disponibile. Selectați cel dorit
  6. În setările shader, activați „tweakBlockDamage”, dezactivați „CloudShadow” și „OldLighting”

Sonic Ether "Incredible Shaders"
Umbrele lui Sildur
Chocapic13 "Shaders
sensi277 "s yShaders
Umbrele lui MrMeep_x3 "
Cel Shaders al lui Naelego
Shaders RRe36 "
CUDA Shaders de la DeDelner
bruceatsr44 "s Acid Shaders
Beed28 "Shaders
Pachetul Shader al Ziipzaap
robobo1221 "Shaders
dvv16 "s Shaders
Stazza85 super shaders
hoo00 "Shaders pack B
Regi24 "Plante ondulate
MrButternuss ShaderPack
Grafica minunată a lui DethRaid pe Nitro Shaders
Edi "s Shader ForALLPc" s
CrankerMan "TME Shaders"
Kadir Nck Shader (pentru skate702)
Umbrii lui Werrus
Knewtonwako "Life Nexus Shaders"
CYBOX shaderpack
CrapDeShoes CloudShade Alpha
AirLoocke42 Shader
Captersatsu BSL Shaders
Umbrele Trilitonului
ShadersMcOfficial "Bloominx Shaders (Shaders Chocapic13")
dotModded "Continuum Shaders"
Qwqx71 "s Lunar Shaders (chocapic13" s shader)

Proiectat pentru executarea de către procesoare de plăci video (GPU). Shaders sunt compilate într-unul dintre limbajele de programare specializate (a se vedea) și compilate în instrucțiuni pentru GPU.

Cerere

Înainte de utilizarea umbrelor, se folosea generarea de textură procedurală (de exemplu, utilizată în jocul Unreal pentru a crea texturi animate de apă și foc) și multitexturarea (pe care se baza limbajul shader folosit în jocul Quake 3). Aceste mecanisme nu au oferit aceeași flexibilitate ca umbrele.

Odată cu apariția conductelor grafice reconfigurabile, a devenit posibilă efectuarea de calcule matematice (GPGPU) pe GPU. Cele mai cunoscute mecanisme GPGPU sunt nVidia CUDA, Microsoft DirectCompute și open source OpenCL.

Tipuri de umbre

Umbrele de vertex

Vertical shader operează pe date asociate vârfurilor poliedrelor, de exemplu, cu coordonatele unui vârf (punct) în spațiu, cu coordonate de textură, cu o culoare de vârf, cu un vector tangent, cu un vector binormal, cu un normal vector. Un umbrer de vârf poate fi utilizat pentru vizualizarea și transformarea în perspectivă a vârfurilor, pentru generarea coordonatelor de textură, pentru calcularea iluminării etc.

Exemplu de cod pentru un vertex shader în limba:

vs.2.0 dcl_position v0 dcl_texcoord v3 m4x4 oPos, v0, c0 mov oT0, v3

Umbrele geometrice

Un nuanț geometric, spre deosebire de un vârf, este capabil să proceseze nu numai un vârf, ci și un întreg primitiv. Primitivul poate fi un segment (două vârfuri) și un triunghi (trei vârfuri), iar dacă există informații despre vârfurile adiacente (adiacența engleză) pentru o primitivă triunghiulară, pot fi procesate până la șase vârfuri. Shaderul de geometrie este capabil să genereze primitive din mers (fără a utiliza procesorul central).

Umbrele geometrice au fost utilizate pentru prima dată pe plăcile grafice din seria Nvidia 8.

Umbrele pentru pixeli (fragmente)

Shader-ul de pixeli funcționează cu felii și texturi de bitmap - procesează date asociate pixelilor (de exemplu, culoare, adâncime, coordonate de textură). Shader-ul pixelilor este utilizat în ultima etapă a conductei grafice pentru a forma un fragment al unei imagini.

Exemplu de cod pentru un pixel shader în limba:

ps.1.4 texld r0, t0 mul r0, r0, v0

Avantaje și dezavantaje

Avantaje:

  • capacitatea de a compune orice algoritmi (flexibilitate, simplificare și reducere a costului ciclului de dezvoltare a programului, creșterea complexității și realismului scenelor redate);
  • viteza de execuție crescută (comparativ cu viteza de execuție a aceluiași algoritm executat pe procesorul central).

Dezavantaje:

  • nevoia de a învăța un nou limbaj de programare;
  • existența diferitelor seturi de instrucțiuni pentru GPU-uri de la diferiți producători.

Limbaje de programare

Un număr mare de limbaje de programare shader au fost create pentru a răspunde diferitelor nevoi ale pieței (grafica computerizată are multe domenii de aplicare).

De obicei, limbile pentru scrierea umbrelor oferă programatorului tipuri speciale de date (matrice, eșantioane, vectori etc.), un set de variabile și constante încorporate (pentru interacțiunea cu funcționalitatea standard a API-ului 3D).

Redare profesională

Următoarele sunt limbaje de programare shader care sunt axate pe obținerea unei calități maxime de redare. În astfel de limbi, proprietățile materialelor sunt descrise folosind abstracții. Acest lucru permite oamenilor care nu au abilități speciale de programare și nu cunosc specificul implementărilor hardware să scrie cod. De exemplu, artiștii pot scrie aceste umbrere pentru a oferi „aspectul potrivit” (maparea texturilor, amplasarea luminii etc.).

De obicei, procesarea unor astfel de umbrere este destul de intensivă în resurse: crearea de imagini fotorealiste necesită multă putere de calcul. De obicei, cea mai mare parte a calculului este realizată de clustere mari de calculatoare sau de sisteme blade.

RenderMan Limbajul de programare shader, implementat în software-ul RenderMan de la Pixar, a fost primul limbaj de programare shader. API-ul RenderMan, dezvoltat de Rob Cook și descris în Specificația interfeței RenderMan, este standardul de facto pentru redarea profesională, utilizat pe parcursul lucrărilor Pixar. OSL OSL - eng. Open Shading Language este un limbaj de programare shader dezvoltat de Sony Pictures Imageworksși seamănă cu limbajul. Este utilizat în programul proprietar „Arnold”, dezvoltat de Sony Pictures Imageworks și destinat redării, și în programul gratuit Blender, destinat creării graficelor computerizate tridimensionale. Redare în timp real GLSL GLSL deschiderea GL S Hinging L angoasă) este un limbaj de programare shader descris în standardul OpenGL și bazat pe versiunea limbajului descris în standardul ANSI C. Limbajul acceptă majoritatea caracteristicilor ANSI C, acceptă tipurile de date utilizate adesea atunci când se lucrează cu grafică tridimensională (vectori, matrice). Cuvântul „shader” din GLSL se referă la o unitate compilată independent scrisă în această limbă. Cuvântul „program” se referă la o colecție de umbrere compilate legate între ele. Cg (ing. C pentru g rafici) este un limbaj de programare shader dezvoltat de nVidia împreună cu Microsoft. Limba este similară limbii și limbajului HLSL dezvoltat de Microsoft și inclus în DirectX 9... Limbajul folosește tipurile „int”, „float”, „half” (un număr în virgulă mobilă de 16 biți). Limbajul susține funcții și structuri. Limbajul are optimizări deosebite sub forma „matricilor împachetate” (