Laboratorul 06

Deferred Rendering este o tehnica avansata, extensibila si versatila de sinteza in timp real de imagini ale obiectelor dintr-o scena 3D. Modul in care randati pana acum(cu iluminare imediata in vertex/fragment shader) se numeste forward rendering.

Cu un nume sugestiv, 'intarziat' sau 'amanat', tehnica se bazeaza pe randarea de informatie geometrica(pozitie in world space, normala in world space) si texturala(diffuse, specular, etc.) in render targets separate intr-un prim pas, amanand procesul de iluminare pentru un pas urmator, utilizand alte render targets pentru iluminare iterativa respectiv compozitie finala cu texturare, de data aceasta desenand un simplu quad ce se mapeaza peste intreg ecranul, quad texturat cu imaginea compusa din texturile diffuse specular si iluminarea calculata separat.

Avantaje

  1. iluminarea se randeaza eficient, constient de zonele de influenta ale luminilor, eliminand calcule in plus, precum desenarea (cu iluminare) unui obiect ce este obturat complet sau partial de un alt obiect (cu forward rendering).
  2. Extensibilitatea, faciliteaza compositing-ul cu diverse postprocesari ale informatiilor vizuale(e.g. cel shading cu edge detection pe render texture de normale/depth, bloom/glow, etc.), in pasul final, sau in pasi (la fel ca ultimul) adaugati manual de post procesare tip pipeline.
  3. complexitatea tehnicii deferred este O(N + L), in timp ce complexitatea forward rendering este O(N * L). De ce? se separa buclele iterative peste multimea de lumini si multimea de obiecte din scena:
Forward:
	for (obiect in obiecte):
		for (lumina in lumini):
			render(lumina, obiect)
Deferred:
	for (obiect in obiecte):
		render(obiect, Gbuffer)
	for (lumina in lumini):
		render(lumina)

Dezavantaje

  1. complexitatea implementarii
  2. se pierde hardware accelerated anti-aliasing, dar nu ne prea pasa, exista multe solutii de sinteza avansata de anti-aliasing, precum SSAA, MSAA, FXAA(very fast), TSAA, etc.
  3. dimensiunea mare a GBuffer-ului, memory overload pe GPU, dar exista deferred lighting si alte tehnici tiled forward++, etc. fiecare cu avantajele si dezavantajele sale.

Forward Rendering

In forward rendering culoarea finala a unui pixel se obtine prin contributia fiecarui fragment afisat in acel pixel, iar pentru culoarea fragmentelor se evalueaza contributia de la fiecare lumina din scena. Din cauza aceasta, sunt evaluate fragmente ce vor fi ocludate ulterior sau se calculeaza contributia neglijabila a unei lumini indepartate.

Deferred Rendering

In deferred rendering, ecuatia de iluminare nu se mai executa pentru fiecare combinatie posibila (obiect, lumina), ci doar pentru luminile ce garantat au o contributie ne-neglijabila.

Acest lucru se face in 3 etape:

  1. GEOMETRY PASS: evaluarea informatiilor geometrice si texturale per pixel
  2. LIGHT ACCUMULATION PASS: folosind functia de blend (GL_ONE, GL_ONE), se acumuleaza intr-un render target rezultatul calculului de iluminare pentru fiecare lumina, utilizand informatiile geometrice randate in G-buffer la pasul 1.
  3. FINAL(COMPOSITION) PASS: se evalueaza culoarea finala a pixelului ca functie de iluminarea acumulata la pasul anterior si de informatiile texturale(si poate si geometrice, e.g. rim light etc.)

Din cauza ca deferred rendering se bazeaza pe faptul ca un singur obiect va fi vizibil per pixel, algoritmul functioneaza atata timp cat obiectele din scena sunt opace, in cazul in care aceasta asertiune este falsa algoritmul nu mai are sens.

Geometry Buffer

Pentru a implementa deferred rendering, vom folosi un frame buffer mare, denumit Geometry Buffer, sau G-Buffer. Acesta are atasate mai multe render textures utilizand GL_COLOR_ATTACHMENT_i.

Geometry Pass

In aceasta etapa sunt completate urmatoarele render targets din G-buffer:

  • adancime(se face automat)
  • pozitie
  • normala
  • culoare

Light Accumulation Pass

In aceasta etapa sunt completate intrarile din G-buffer pentru acumularea de lumina.

Pentru a calcula intersectia intre oiecte si lumini vom folosi obiecte geometrice aferente luminilor: sfera cu raza egala cu distanta maxima de influenta pentru lumina omnidirectionala, con cu sfera in baza pentru spot light(nu e implementat in laborator).

Pentru fiecare fragment de obiect ce reprezinta o lumina se incarca pozitia si normala din G-buffer si se evalueaza ecuatia de iluminare. Rezultatul este acumulat in bufferul de acumulare din G-buffer.

Final Pass

In aceasta etapa se calculeaza rezultatul final per pixel. Ouptut-ul nu se mai face in G-buffer, ci direct in framebufferul default sau in vreun altul pregatit pentru postprocesare. Se combina culoarea pixelului cu iluminarea calculata si cu lumina ambientala.

Cerinte laborator

  1. Completati laboratorul cu cerintele
spg/laboratoare/06.txt ยท Last modified: 2022/11/14 09:41 by maria_anca.balutoiu
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0