190 likes | 495 Vues
Shadow Mapping. Sombras em superfícies curvas. Shadow map Aliasing Suporte em hardware Mais eficiente Shadow volume “Hard-shadow” Ideal para sombras em regiões grandes. Shadow map. Algoritmo “Renderiza” cena do ponto de vista da fonte de luz Usa Z-buffer como textura: shadow map
E N D
Sombras em superfícies curvas • Shadow map • Aliasing • Suporte em hardware • Mais eficiente • Shadow volume • “Hard-shadow” • Ideal para sombras em regiões grandes
Shadow map • Algoritmo • “Renderiza” cena do ponto de vista da fonte de luz • Usa Z-buffer como textura: shadow map • Texel: distância da fonte ao objeto mais próximo • Renderiza cena aplicando shadow map • Textura projetiva do ponto de vista da fonte de luz • Teste de sombra • If r <= texel then “iluminado” else “sombra” end texel texel = r r
Shadow map Suporte em hardware • Com Cg, se textura é um shadow map • Função tex2Dproj • Valor de retorno {c,c,c,1}, com c valendo zero ou um • Pode-se aplicar filtro: 0 <= c <= 1 • Diminui aliasing • Pode-se programar filtros melhores • Percentage-closer filter • Técnicas de dithering 0 1 c = 0.75 1 1
Shadow map • Shadow map não depende do observador • Sempre válido para objetos e fontes estáticos • Idéias • Reaproveitamento do shadow map • Explorar coerência quadro a quadro • Dois shadow maps • Um para objetos estáticos • Um para objetos dinâmicos (atualizada frequentemente)
Shadow map • Problemas • Self-shadows • Imprecisão numérica • r texel • Soluções • Melhorar ajuste do “volume de visão” da fonte de luz • Usar offset na geração do mapa • Usar mapa de ID em vez de mapa de profundidade • Gerar mapa com back-faces
Aliasing • Percentage Closer Filter • Grid regular • “Banding effects” for (int i=0; i<NSAMPLES; i++) { sm.xy = offsets[i] * fsize + smPos; shadow += tex2DProj(shadowMap,sm) / NSAMPLES; }
Eliminando “banding effects” • Jittered grid • Domínio circular • Preservando áreas • x = x1/2 cos(2u) • y = y1/2 cos(2u)
Eliminando “banding effects” • Múltiplos offsets • Pixels vizinhos com offsets diferentes • Textura 3D de RGBA • Dois offsets (2 pares x,y) por texel t = frag.y r = offset s = frag.x
Melhorando desempenho • Uso de “branching” no shader • Menos amostras para determinar penumbra • Fragmentos próximos com mesmo branching -- Testa se em penumbra for (int i=0; i<4; i++) { vec4 offset = tex3D(jitter,jcoord); jcoord.z += 1.0 / SAMPLES_COUNT_DIV2; sm.xy = offset.xy * fsize + smPos; shadow += tex2DProj(shadowMap,sm) / 8; sm.xy = offset.zw * fsize + smPos; shadow += tex2DProj(shadowMap,sm) / 8; } ... if ((shadow-1)*shadow != 0) { -- Em penumbra }
Melhorando desempenho • Se mapa gerado com “back face” • Não incorpora erros na imagem, mas... • “Self-shadow” degrada desempenho • Correção: if ((shadow-1) * shadow * NdotL != 0) { -- Em penumbra }
Perspective shadow map • Problemas de aliasing • Projeção de visualização pode expandir sombra • Enquanto no mapa aparece pequeno ds • ds : limitado pela resolução do mapa • rs/ri : se pequeno e constante, diminuialiasing de perspectiva • βi/βs : difícil eliminação, pois a luz pode tangenciar a superfície (aliasing de perspectiva) βs di βi ri
Perspective shadow map • Mapa de sombras com • Resolução alta para objetos próximos • Resolução baixa para objetos distantes • Objetivo • Diminuir aliasing de perspectiva • Idéia • Gerar mapa no espaço após perspectiva
Perspective shadow map • Exemplo: árvores vistas da esquerda • Espaço do olho • Árvores de mesmo tamanho • Espaço após perspectiva • Árvores próximas maiores
Perspective shadow map • Geração do mapa • Transforma cena para espaço de clip • “Renderiza” mapa com fonte de luz transformada • No exemplo anterior: rs/ri = cte
PP -1 x 1 f (f+n)/(f-n) x z z Perspective shadow map • Transformação da fonte de luz • Luz direcional: {x,y,z,0} • Luz pontual: {x,y,z,1} • Transformação perspectiva
Perspective shadow map • Transformação perspectiva • Ponto no infinito • Ponto finito com z = (f+n)/(f-n) • Ponto finito • Pode se transformar em ponto no infinito • Se no plano z=0 • Transformação da fonte de luz • Luz direcional • Permanece direcional se pw=0 • Acontece se: {x,y,0,0} {px,py,0,0} • Luz local • Pode se transformar em luz direcional • Luz no plano do observador • Melhor ganho do PSM
Perspective shadow map • Self-shadow é acentuado • PSM depende da posição do observador • Frustum da fonte pode cruzar plano z=0 • Cruza infinito após transformação • Frustum de interesse • M = convex hull (V + l) • M contém todos os raios de luz que interceptam objetos da cena • H = M BV L • Se H cruza plano z=0 • Afasta observador para gerar PSM • Tende a se aproximar do PS