shadow mapping. sombras em superfícies curvas shadow map aliasing suporte em hardware mais...
TRANSCRIPT
Shadow Mapping
Sombras em superfícies curvasSombras em superfícies curvas Shadow map
AliasingSuporte em hardware
Mais eficiente
Shadow volume“Hard-shadow”Ideal para sombras em regiões grandes
Shadow mapShadow map Algoritmo
“Renderiza” cena do ponto de vista da fonte de luzUsa Z-buffer como textura: shadow map
– Texel: distância da fonte ao objeto mais próximo
Renderiza cena aplicando shadow mapTextura projetiva do ponto de vista da fonte de luzTeste de sombra
– If r <= texel then “iluminado” else “sombra” end
texel
r
texel = r
Shadow mapShadow map
Suporte em hardwareCom 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
1 1c = 0.75
Shadow mapShadow map Shadow map não depende do observador
Sempre válido para objetos e fontes estáticos
IdéiasReaproveitamento do shadow map
– Explorar coerência quadro a quadroDois shadow maps
– Um para objetos estáticos– Um para objetos dinâmicos (atualizada frequentemente)
Shadow mapShadow 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
AliasingAliasing 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 “Eliminando “banding effects”banding effects” Jittered grid
Domínio circularPreservando áreas
x = x1/2 cos(2u)y = y1/2 cos(2u)
Eliminando “Eliminando “banding effects”banding effects” Múltiplos offsets
Pixels vizinhos com offsets diferentesTextura 3D de RGBA
– Dois offsets (2 pares x,y) por texel
s = frag.x
t = frag.y
r = offset
Melhorando desempenhoMelhorando desempenho Uso de “branching” no shader
Menos amostras para determinar penumbra Fragmentos próximos com mesmo branching
-- Testa se em penumbrafor (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 desempenhoMelhorando 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 mapPerspective shadow map
Perspective shadow mapPerspective shadow map Problemas de aliasing
Projeção de visualização pode expandir sombra Enquanto no mapa aparece pequeno
ds
di
ri
βs
βi
• 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
i
i
ssi rrdd
ββ
=
Perspective shadow mapPerspective shadow map Mapa de sombras com
Resolução alta para objetos próximosResolução baixa para objetos distantes
ObjetivoDiminuir aliasing de perspectiva
IdéiaGerar mapa no espaço após perspectiva
Perspective shadow mapPerspective 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 mapPerspective 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 mapPerspective 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
x
z
1
-1
Perspective shadow mapPerspective 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 mapPerspective 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