Efekty specjalne w grach wideo

Transkrypt

Efekty specjalne w grach wideo
EFEKTY SPECJALNE
W GRACH WIDEO
Postprocessing & HDR
Bartłomiej Filipek
bartlomiejfilipek.pl
Idea

Jak odwzorować w jednej scenie:
 Latarkę?
 Mocne
światło?
 Światło odbite z chmur?
 Słońce?
Idea

Zakres luminancji
1012 : 1 (HDR)
 Oko 104 : 1 (HDR)
 Monitory 700 : 1 (LDR)
 Rzeczywisty:

Pytanie jak zawężać rzeczywisty zakres
luminancji do „widzialnego” pasma?
Wazniak: Światło i barwa w grafice komputerowej
Cel
HDR Pipeline (1)
Scene
Bufor HDR
Tone map
LDR screen
buffer
Co potrzebujemy?

Npot textures
FBO lub jakaś inna metoda do RTT
Floating point textures

ToneMap operator


 Chcemy
zachować kolory, a zmienić tylko
jasność…
Floating point RT

Floating point nie obcina koloru do 1.0

Formaty (openGL WIKI):
16F, 32F
 Różne pochodne (10.10.10.2, etc)



Na nasze potrzeby: GL_RGBA16F,
GL_LUMINANCE32F
Podczas liczenia kolorów nie używamy
własnoręcznie clamp, saturate, czy innych!
Simple Tone Map
Luminput L(Color )
Lum 
Luminput
1  Luminput
Color *  Lum
RGB?




RGB -> Luminancja
Luminancja -> RGB ??
RGB -> Cie XYZ -> Cie Yxy
Cie Yxy -> XYZ -> RGB
HDR Pipeline (2)
Count
Luminance
Scene
Bufor HDR
Tone map
LDR screen
buffer
Advanced ToneMap
Luminput  lum (Color )
Lumscaled 
Luminput * MiddleGray
LumAverage
Lum scaled
Lum scaled *(1 
)
2
Lum white
Lum 
1  Lum scaled
Advanced ToneMap
LumAverage – policzona średnia luminancja dla
sceny
LumWhite – minimalny kolor, który będzie mapowany jako
biały…
MiddleGray - Adams, Ansel
The Zone Scale
0
I
II
III
IV
V
VI
VII
VIII
IX
X
Liczenie luminancji…

Na CPU… proste, ale WOLNE!

Więc pozostaje GPU
Skalujemy teksturę z całą sceną – do sensownej
wartości (64x64 ok…)
 Dla każdego fragmentu zliczamy 16 tekseli –
sąsiadów 4x4
 Log4N przebiegów… (np. 64x64 -> 16x16 -> 4x4 ->
1x1)


Na końcu otrzymujemy jedną wartość – średnią
luminancję sceny.
Liczenie luminancji…
Ustaw teksturę ze sceną
Wykonaj skalowanie
(glBlitFramebufferEXT)
Ustaw shader na
DownSample
Ustaw teksturę
otrzymaną ze
skalowania
Renderuj quad o
rozmiarze 4x
mniejszym…
Ustaw kolejny shader
Ustaw teksturę
otrzymaną z
poprzedniego przebiegu
Renderuj quad na
ekranie o rozmiarze
docelowej tekstury (np.
16x16)
…
Aż do tekstury 1x1
DownScale
for (int i = 0; i < 16; ++i) {
luminance += texture2D(inputTexture,
gl_TexCoord[0].st + off * PixelCoordsDownFilter[i]).r;
}
HDR Pipeline (3)
Down Scale
Bright Pass
Count
Luminance
Gussian Blur
Scene
Bufor HDR
Tone map
+ Glow
LDR screen
buffer
HDRLighting Sample
http://msdn.microsoft.com/en-us/library/ee417769(VS.85).aspx
Glow


Bright Pass – wybiera jasne texele
Blur
 Horizontal
 Vertical

Add to final result
 Out
= mix(sceneColor, glowColor, Ratio)
Dodatki

Adaptacja oka

Star Effect

Użycie wszędzie tekstur HDR

Kompresja Tekstur

Inne operatory ToneMap, inne przestrzenie
kolorów…
Uwagi

Uważać na poprawne ustawienia tekstur!
 Pamiętać
o ustawieniu do której jednostki
teksturowania jest przypisany dany sampler!

Quady w screen space do renderowania
przejść…
Materiały

http://wiki.gamedev.net/index.php/D3DBook:P
ost_Processing_Pipeline

http://wiki.gamedev.net/index.php/D3DBook:Hi
gh-Dynamic_Range_Rendering

More OpenGL Programming

http://www.mpi-inf.mpg.de/resources/tmo/

High Dynamic Range Rendering
Postprocessing…

Inne ciekawe efekty
 DOF
 Motion
Blur
 SSAO
 Cartoons
…
/ NPR
Depth Of Field

http://http.developer.nvidia.com/GPUGems/gpugems_ch
23.html
Motion Blur

http://http.developer.nvidia.com/GPUGems3/gpugems3_ch27.html
NPR

gpugems 2, Blueprint Rendering and "Sketchy
Drawings"
SSAO

http://drobot.org/pub/GCDC_SSAO_RP_29_08.pdf

Podobne dokumenty