Shadow Mapping. Sombras em superfícies curvas Shadow map Aliasing Suporte em hardware Mais...

Preview:

Citation preview

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

Recommended