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