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?

Podobne dokumenty