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

19
Shadow Mapping

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

Page 1: Shadow Mapping. Sombras em superfícies curvas  Shadow map  Aliasing  Suporte em hardware  Mais eficiente  Shadow volume  “Hard-shadow”  Ideal para.

Shadow Mapping

Page 2: Shadow Mapping. Sombras em superfícies curvas  Shadow map  Aliasing  Suporte em hardware  Mais eficiente  Shadow volume  “Hard-shadow”  Ideal para.

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

Page 3: Shadow Mapping. Sombras em superfícies curvas  Shadow map  Aliasing  Suporte em hardware  Mais eficiente  Shadow volume  “Hard-shadow”  Ideal para.

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

Page 4: Shadow Mapping. Sombras em superfícies curvas  Shadow map  Aliasing  Suporte em hardware  Mais eficiente  Shadow volume  “Hard-shadow”  Ideal para.

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

Page 5: Shadow Mapping. Sombras em superfícies curvas  Shadow map  Aliasing  Suporte em hardware  Mais eficiente  Shadow volume  “Hard-shadow”  Ideal para.

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)

Page 6: Shadow Mapping. Sombras em superfícies curvas  Shadow map  Aliasing  Suporte em hardware  Mais eficiente  Shadow volume  “Hard-shadow”  Ideal para.

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

Page 7: Shadow Mapping. Sombras em superfícies curvas  Shadow map  Aliasing  Suporte em hardware  Mais eficiente  Shadow volume  “Hard-shadow”  Ideal para.

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;}

Page 8: Shadow Mapping. Sombras em superfícies curvas  Shadow map  Aliasing  Suporte em hardware  Mais eficiente  Shadow volume  “Hard-shadow”  Ideal para.

Eliminando “Eliminando “banding effects”banding effects” Jittered grid

Domínio circularPreservando áreas

x = x1/2 cos(2u)y = y1/2 cos(2u)

Page 9: Shadow Mapping. Sombras em superfícies curvas  Shadow map  Aliasing  Suporte em hardware  Mais eficiente  Shadow volume  “Hard-shadow”  Ideal para.

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

Page 10: Shadow Mapping. Sombras em superfícies curvas  Shadow map  Aliasing  Suporte em hardware  Mais eficiente  Shadow volume  “Hard-shadow”  Ideal para.

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}

Page 11: Shadow Mapping. Sombras em superfícies curvas  Shadow map  Aliasing  Suporte em hardware  Mais eficiente  Shadow volume  “Hard-shadow”  Ideal para.

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}

Page 12: Shadow Mapping. Sombras em superfícies curvas  Shadow map  Aliasing  Suporte em hardware  Mais eficiente  Shadow volume  “Hard-shadow”  Ideal para.

Perspective shadow mapPerspective shadow map

Page 13: Shadow Mapping. Sombras em superfícies curvas  Shadow map  Aliasing  Suporte em hardware  Mais eficiente  Shadow volume  “Hard-shadow”  Ideal para.

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

ββ

=

Page 14: Shadow Mapping. Sombras em superfícies curvas  Shadow map  Aliasing  Suporte em hardware  Mais eficiente  Shadow volume  “Hard-shadow”  Ideal para.

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

Page 15: Shadow Mapping. Sombras em superfícies curvas  Shadow map  Aliasing  Suporte em hardware  Mais eficiente  Shadow volume  “Hard-shadow”  Ideal para.

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

Page 16: Shadow Mapping. Sombras em superfícies curvas  Shadow map  Aliasing  Suporte em hardware  Mais eficiente  Shadow volume  “Hard-shadow”  Ideal para.

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

Page 17: Shadow Mapping. Sombras em superfícies curvas  Shadow map  Aliasing  Suporte em hardware  Mais eficiente  Shadow volume  “Hard-shadow”  Ideal para.

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

Page 18: Shadow Mapping. Sombras em superfícies curvas  Shadow map  Aliasing  Suporte em hardware  Mais eficiente  Shadow volume  “Hard-shadow”  Ideal para.

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

Page 19: Shadow Mapping. Sombras em superfícies curvas  Shadow map  Aliasing  Suporte em hardware  Mais eficiente  Shadow volume  “Hard-shadow”  Ideal para.

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