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 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 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 Soluções 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; } ... 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
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, diminui aliasing 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
Perspective shadow map Transformação da fonte de luz Luz direcional: {x,y,z,0} Luz pontual: {x,y,z,1} Transformação perspectiva PP x z (f+n)/(f-n) f 1 -1
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