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