Steps3d - tutoriale - modelarea în profunzime a câmpului

Unul dintre efectele speciale simple și destul de frumoase pe care le puteți adăuga cu ușurință în programul dvs. este așa-numita adâncime de profunzime a câmpului.







Acest concept este legat de faptul că orice dispozitiv optic reală (de exemplu dispozitivul, în cazul în care diametrul obiectivului este mai mare decât zero) nu pot deține simultan toate obiectele din focalizare.

Întotdeauna unele obiecte (situate la o anumită distanță focală) vor fi focalizate, adică vor fi afișate în mod clar, iar obiectele care sunt mult mai aproape sau mai departe de această distanță nu vor fi focalizate, adică va fi neclară. Amplitudinea acestei neclare depinde de cât distanța față de subiect diferă de lungimea focală.

Conform legilor opticii, există o relație între distanța de la obiectiv la „premnika“, iar distanța de la obiectiv la subiect, la MDM subiectul este focalizat.

Figura 1. Funcționarea celui mai simplu obiectiv.

Acest raport este dat cu formula următoare, aici după u și v reprezintă distanța de la obiectiv la „receptor“ și obiectul, și f - așa-numitul distanța focală a cristalinului.

Dacă aranjăm suprafața la o distanță d de obiectiv, atunci cercul din acest plan va corespunde punctelor de pe "receptor" - așa numitul Cerc de Confuzie (COC).

Există o formulă pentru obținerea diametrului COC de la obiectivul obiectivului f. a și lungimea focală dfocus.







Cu toate acestea, pentru a aplica această formulă în practică este destul de complicată și ne vom baza pe o abordare mult mai simplă, considerată în cărțile ShaderX 2 și ShaderX 3.

Proprietăți Lens descriem doar două valori - distanta focala (focalDistance) și modul în care gradul de obiect razmychtosti depinde de distanța față de abaterea focală (focalRange).

Acest lucru permite direct în shader fragment pentru z -coordinate (la sistemul de coordonate al observatorului) pentru a calcula gradul de neclaritate al fragmentului (blur) și scrie în canalul alfa a imaginii.

Mai jos sunt vârful corespunzător și shaderele fragmentului.

Următorul pas va fi construirea unei isobarizări reduse de 4x4 (pentru aceasta puteți utiliza filtrarea bilineară pentru a administra doar patru mostre din textură) și neclaritatea acesteia.

Figura 2. Utilizarea interpolării bilinere.

Următorul pas este de a bloca selectiv imaginea originală utilizând un set de puncte având o distribuție numită disc Poisson.

Cea mai simplă variantă este gradul de estompare (neclaritate) de la canalul alfa al imaginii sursă pentru a controla dimensiunea filtrului adr. - raza filtrului este specificată ca blur * radiusScale.

Pentru a îmbunătăți calitatea, puteți lua valori din două texturi simultan: originale și reduse. În acest caz, greutatea fiecărei texturi va fi determinată de gradul de estompare a punctului de plecare.

Ultimul pas este de a combate așa-numitele artefacte neetanșe - atunci când un obiect popdaet luminos pentru a filtra în funcție de un alt punct și dă o aură de lumină, deși acești termeni pot avea diferite adâncimi (și gradul de neclaritate).

Următoarea este implementarea corespunzătoare a software-ului.

Mai jos este codul sursă complet pentru C ++ pentru un exemplu care demonstrează utilizarea acestui efect.







Articole similare

Trimiteți-le prietenilor: