Efekty specjalne w grach wideo
Transkrypt
Efekty specjalne w grach wideo
EFEKTY SPECJALNE W GRACH WIDEO Cienie Bartłomiej Filipek bartlomiejfilipek.pl 1000k lini kodu aby uzyskać taki efekt schodków! Plan Cienie ogólnie Cienie planarne Shadow Volumes Podstawowa idea ShadowMaps Rendering głębii Projekcja tekstury Test głębi Redukcja artefaktów Dodatki Cienie Cienie wikipedia Cienie Proste metody Płaski teren Spłaszczyć obiekt i wyświetlić na terenie… Użyć „shadowMatrixProjection” http://erich.realtimerendering.com/plateaus.pdf Shadow Volume extrude ID’s Doom3 Shadow Volume - implement Użyj „Extrude” do renderowania bryły cienia Tylko do stencil buffer Podczas renderingu finalnego sprawdzaj stencil Shadow Volume Zalety Dobre do świateł punktowych Pomieszczenia Można wykorzystać GeoShader do extrude i obrysu Wady Należy posiadać specjalną geometrię do „extrude” Wcześniej problem z CPU i przetwarzaniem obrysu Więcej DX9, DX10 – samples -> ShadowVolume Idea ShadowMaps W cieniu jest to czego nie „widzi” światło. Zapisz informacja co widzi światło… Podczas końcowego renderingu sceny: Dla każdego fragmentu sprawdź czy światło go „widzi” Rendering głębi FBO Depth Attachment Textura: DEPHT_COMPONENT Rendering DrawBuffer(NONE) ColorMask(0, 0, 0, 0) Disable(everything) Rendering głębi void RenderShadowMap() { currDepth->Bind(); glClear(GL_DEPTH_BUFFER_BIT); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gLightCam.SetProjectionMatrix(); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gLightCam.SetViewMatrix(); glColorMask(false, false, false, false); glUseProgram(0); SimpleScene(); glColorMask(true, true, true, true); } Ustaw się w pozycji światła Czy jesteśmy w cieniu? Podczas finalnego renderingu sceny: Dowiedz się jaka jest pozycja danego fragmentu względem światła Przekształć odpowiednio pozycję.. Sprawdź czy wyżej otrzymana pozycja jest na mapie cienia Czy CalcPos.z Odpowiednio ? MapDepth zmodyfikuj kolor w zależności czy jesteśmy w cieniu czy nie… Przestrzeń projekcji kamery Przestrzeń Kamery/Oka Ekran MVC = Macierz Widoku Kamery MVC-1 * MVL * MPL * MCL Przestrzeń Obiektu Przestrzeń Świata MVL =Macierz Widoku Światła Tekstura Przestrzeń Widoku Światła MPL = Projekcja Przestrzeń projekcji światła MCL =macierz do przestrzeń tekstury Transformacja do światła… 1. 2. 3. eye_pos = gl_ModelViewMatrix * gl_Vertex world_pos = InvCameraMatrix * eye_pos light_pos = LightViewProj * world_pos Z przestrzeni eye/camera do przestrzeni świtła 4. 5. 6. light_pos.xyz / light_pos.w light_pos.xyz += 1.0 light_pos.xyz *= 0.5 Z 3D do przestrzeni tekstury 0.0 <= z, y, z <= 1.0 Testowanie… uniform sampler2DShadow shadowMap; … float factor = shadow2D(shadowMap, proj.xyz).r; factor = 0 gdy w cieniu, 1 wpp Ustawienia tekstury cienia: glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE_ARB, GL_COMPARE_R_TO_TEXTURE_ARB); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC_ARB, GL_LEQUAL); Texture Comparison Function Computed result GL_LEQUAL result = 1.0 0.0 r <= D t r > D t GL_GEQUAL result = 1.0 0.0 r >= D t r < D t GL_LESS result = 1.0 0.0 r < D t r >= D t GL_GREATER result = 1.0 0.0 r > D t r <= D t r – trzecia współrzędna textury, D – wartość odczytana z textury Redukcja artefaktów polygon_offset(factor, units) factor × DZ + r × units PCF Redukcja migotania Lepsze wykorzystanie mapy Dodatki Światła kierunkowe Światła punktowe Facetted Shadow Maps Cascades Shadow Maps Perspective Shadow Maps ShadowVolume + ShadowMap = hybrid Percentage Closer Soft Shadows Materiały More OpenGL Programming http://www.opengl.org/wiki/GL_EXT_framebuffer_object http://developer.nvidia.com/object/doc_shadows.html http://www.paulsprojects.net/tutorials/smt/smt.html Pytania?