Tecgraf/PUC-Rio
Reflexão e Sombras em Tempo Real
Waldemar Celes
Textura Projetiva
Textura Projetiva
q Projeção de imagens sobre superfícies
ð Exemplo: projetor de slides
Projective Texture Mapping Cass Everitt - nVidia
Geração de Coord de Textura
q Combinação linear
ð Espaço do objeto
² Eq. do plano: [a,b,c,d]T
² Geração de coordenada: s = ax+by+cz+dw
ð Espaço do olho
² Eq. do plano: [a,b,c,d]T
² Transf. do plano: [a’,b’,c’,d’] T = [a,b,c,d] M-1
² Geração de coordenada: s = a’xe+b’ye+c’ze+d’we
Pipeline de Transformações
q Para visualização
ð Model
ð View
ð Projection
² Clip space: -1 a 1 q Para projeção
ð Model
ð Projector view
ð Projector projection
² Texture space: 0 a 1
Geração de Coord. Projetiva
q Espaço do objeto
ð Posicionamento do projetor no espaço global
tion transforma
space texture
to clip
projector of
e perspectiv projection
projector
projector of
lookat view
projector matrix model
w z y x
q r t s
p p
p p
:
) (
:
) (
: :
12 12
12 12
S T P V M
M V P S T T
T
o
o
=
!!
!!
"
#
$$
$$
%
&
=
!!
!!
"
#
$$
$$
%
&
Geração de Coord. Projetiva
q Espaço do olho
ð Posicionamento do projetor no espaço global
tion transforma space
texture to
clip
projector of
e perspectiv projection
projector
projector of
lookup view
projector
matrix view
of inverse
w z y x
q r t s
p p e
e p p e
e e e e
e
:
) (
:
) (
:
1 :
1
12 12
12 12
S T P V V
V V P S T T
T
−
= −
"
"
"
"
#
$
%%
%%
&
'
=
"
"
"
"
#
$
%%
%%
&
'
Geração de Coord. Projetiva
q Codificação da matriz no gerador
ð ps =[T00,T01,T02,T03]
ð Análogo para pt, pr, pq
² No espaço do olho, usa inversa na especificação dos planos
Problemas
q Projeção reversa
ð Textura 1D para eliminar contribuição
² Por exemplo com teste de alpha
² Requer multi-textura
q Filtro anisotrópico é desejável
ð Grande distorção devido a dupla projeção
² Grandes redução e ampliação na mesma textura
Light mapping
q Mais apropriado, dark mapping
ð Projeta textura sobre superfícies
ð Mapas, em geral, em baixa resolução
ð Animação com coordenadas de textura
Texturas: mapas de atenuação
v=1.0 v=0.5
Reflexão Planar
Reflexão plana
Reflexão plana
q Refletor ideal: lei de reflexão
q Traçado de raios
ð Reflete raio
q Formas alternativas
ð Objeto refletido
ð Observador refletido
i n
r
Reflexão plana
q Idéia básica do algoritmo
ð Renderiza cena refletida
² Sem incluir refletor
ð Renderiza cena normal
² Incluindo refletor
² Refletor recebe fator de transparência: reflexividade
Reflexão plana
q Transformação de reflexão
ð Refletor: n = (0,1,0), em y=0
² Espelhamento: S(1,-1,1)
ð Caso geral, refletor: nTp = 0
² Mudança de base: F = R(n,j) T(-p)
² Espelhamento: M = F-1 S(1,-1,1) F
ð Obs: tem espelhamento
² Altera a orientação das faces!
Reflexão plana
q Problemas
ð Reflexão invertida
² Usar clipping planes
ð Reflexão fora do refletor
² Usar stencil buffer
Reflexão plana
q Algoritmo
ð Marca stencil com refletor
ð Desenha cena refletida
² Sem refletor
² Habilitando plano de clip
² Apenas onde stencil está marcado
² Invertendo orientação das faces
ð Desenha cena normal
² Sem refletor
ð Desenha refletor
² Com alpha indicando reflexividade
² Ativando blend
Reflexão plana com textura
q Algoritmo
ð Desenha cena refletida em textura
² Pode ser em baixa resolução
ð Desenha cena normal
² Aplicando textura no refletor
² Textura projetiva
– Projeção de visualização
² Reflexividade
– Alpha e combinação de textura
Reflexão plana
q Vantagens de usar textura
ð Refletores quase planas
² Mar calmo
ð Imagem refletida com pertubação (noise)
² Agrega realismo
ð Re-uso para cenas estáticas
² Sobrevida em frames consecutivos
q Desvantagens
ð Suporte para renderização em textura
² Menos eficiente que stencil (?)
Sombra Planar
Sombras
Sombras
Sombras
q Sombras
ð “Hard”
² Fonte de luz pontual
ð “Soft”
² Fonte de luz com área
² Regiões caracterizadas
– Umbra – Penumbra
Sombras planas
q Matriz de projeção
ð Plano de sombra
² n.x + d = 0
ð Posição da luz
² l
!!
!!
"
#
$$
$$
%
&
−
−
−
−
− +
−
−
−
−
− +
−
−
−
−
− +
=
nl nl
nl nl
M
z y
x
z z
z y
z x
z
y z
y y
y x
y
x z
x y
x x
x
n n
n
d l n
l d
n l n
l
d l n
l n
l d
n l
d l n
l n
l n
l d
Sombras planas
q Algoritmo
ð Desenha os não receptores
ð Para cada plano receptor
² Desenha com luz ambiente
² Para cada fonte de luz
– Marca stencil com sombras
» Usando a matriz de projeção – Desenha receptor
» Apenas onde stencil não estiver marcado
» Z-func como EQUAL
» Blend como ONE-ONE ð Obs
² LOD para gerar sombra em geral não prejudica qualidade
Sombras planas
q Problemas
ð Falsas sombras
² De objetos após o receptor
ð Anti-sombras
² De objetos atrás da fonte de luz
ð Correção
² Clipping planes paralelos ao receptor
Sombras planas com textura
q Algoritmo
ð Renderiza cena do ponto de vista da fonte de luz
² Matriz de projecão para paralelogramo
² Cena em preto e branco
– Indica regiões de sombra ð Renderiza cena normal
² Aplica textura no receptor
² Evita iluminar regiões de sombra
Geração de Sombras em Superfícies Curvas
Sombras em superfícies curvas
q Shadow map
ð Aliasing
ð Suporte em hardware
² Mais eficiente
q Shadow volume
ð “Hard-shadow”
ð Ideal para sombras em regiões grandes
q Variance shadow map
ð Anti-aliasing
ð Pode falhar
Shadow Mapping
Shadow map
q 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 = r
Shadow map
Suporte em hardware
ð Textura é um shadow map
² DEPTH_COMPONENT
² Tex Parameter:
– TEXTURE_COMPARE_MODE = COMPARE_R_TO_TEXTURE ð Shader
² Função textureProj
– 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 1
c = 0.75
Shadow map
q 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
q 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
q Percentage Closer Filter
ð Grid regular
² “Banding effects”
for (int i=0; i<NSAMPLES; i++) {
sm.xy = offsets[i] * fsize + smPos;
shadow += textureProj(shadowMap,sm);
}
shadow /= NSAMPLES;
Eliminando “ banding effects ”
q Jittered grid
q Domínio circular
ð Preservando áreas
² x = x1/2 cos(2πu)
² y = y1/2 cos(2πu)
Eliminando “ banding effects ”
q Múltiplos offsets
ð Pixels vizinhos com offsets diferentes
² Textura 3D de RGBA
– Dois offsets (2 pares x,y) por texel
s = frag.x t = frag.y
r = offset
Melhorando desempenho
q 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 = texture(jitter,jcoord);
sm.xy = offset.xy * fsize + smPos;
shadow += textureProj(shadowMap,sm) / 8;
sm.xy = offset.zw * fsize + smPos;
shadow += textureProj (shadowMap,sm) / 8;
} ...
if ((shadow-1)*shadow != 0) { -- Em penumbra
}
Melhorando desempenho
q Se mapa gerado com “back face”
ð Não incorpora erros na imagem, mas...
ð “Self-shadow” degrada desempenho
ð Correção:
if ((shadow-1) * shadow * max(NdotL,0) != 0) { -- Em penumbra
}
Perspective shadow map
Perspective shadow map
q 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 s s
i r
d r
d β
= β
Perspective shadow map
q Mapa de sombras com
ð Resolução alta para objetos próximos
ð Resolução baixa para objetos distantes
q Objetivo
ð Diminuir aliasing de perspectiva
q Idéia
ð Gerar mapa no espaço após perspectiva
Perspective shadow map
q 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
q 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
q Transformação da fonte de luz
ð Luz direcional: {x,y,z,0}
ð Luz pontual: {x,y,z,1}
ð Transformação perspectiva
P
P
x z
(f+n)/(f-n)
f
x
z 1 -1
Perspective shadow map
q 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
q 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
q Self-shadow é acentuado
q PSM depende da posição do observador
q 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
Variance Shadow Mapping
Variance shadow mapping
q No lugar de armazenar uma profundidade por texel
q VSM armazena a “distribuição” de profundidade no texel
ð Assumindo uma distribuição normal
q Vantagem
ð Podemos aproximar a média de duas
distribuições usando filtros convencionais de interpolação dos valores armazenados
Variance shadow mapping
q Valores armazenados
ð Média da profundidade:
ð Média da profundidade ao quadrado:
q Distribuição normal:
ð Média e variância: €
µ
€
µ
2€
µ = E x[ ]
σ2 = E x[( −µ)2]
σ2 = E x[ 2 −2µx +µ2] = E x[ ]2 −2µE x[ ]+µ2
σ2 = E x[ ]2 −2µ2 +µ2 = E x[ ]2 −µ2
σ2 = E x[ ]2 − E x[ ]2
Variance shadow mapping
q Chebychev’s inequality
ð Dada uma distribuição normal, a probabilidade de x ser maior ou igual a um determinado valor t é dada por:
€
P x( ≥ t) = σ
2
σ 2 + (t − µ)2
No nosso contexto, dada uma profundide de um fragmento, este valor
representa a percentagem de texel (dentro do filtro) com valores maiores, ou seja, a propabilidade do fragmento receber luz.
Variance shadow mapping
q Algoritmo
ð Renderiza sob ponto de vista da luz
² Armazena na textura:
ð Para diminuir aliasing
² Blur
² Mipmapping
ð Renderiza cena aplicando textura projetiva
² Profundidade do fragmento: d
² Se d < µ então iluminado: i = 1.0
² Senão:
€
depth, depth2
€
i = P(x ≥ d) = σ2
σ2 +(d −µ)2 µ = tex(0)
σ2 = E[x2]− E[x]2 =tex(1)−tex(0)2
Variance shadow mapping
q Limitações
ð Quando a variância é pequena, P(x≥t) tende a zero rapidamente, não tendo problemas
ð Mas, quando a variância é grande, pode haver
“vazamento” de luz
Shadow Volume
Shadow volume
q Determinação dos volumes de sombra
ð Cada objeto delimita um volume de sombra
Shadow volume
q Algoritmo básico
ð Traçado de raio
² Raio entra no volume
– Incrementa contador
² Raio sai do volume
– Decrementa contador
² Determinação da sombra
– Em sombra se contador diferente de zero
Shadow volume: z-pass
q Stencil buffer como contador
ð Limpa stencil
² Com zero (ou 128 se não tratar índice negativo)
ð Desenha cena com luz ambiente
² Z-buffer definido
ð “Desenha” front faces dos volumes
² Teste do z-buffer ativo, sem alterar buffer z e color
² Incrementa stencil se z-teste passar
ð “Desenha” back faces dos volumes
² Decrementando stencil
ð Desenha cena com luz difusa e especular
² Teste de stencil passa quando valor for zero (ou 128)
² Z-func como EQUAL
² Blend como ONE-ONE
Shadow volume: z-pass
q Problema
ð Observador dentro de um volume de sombra
Shadow volume: z-fail
q Stencil buffer como contador
ð “Desenha” back faces dos volumes
² Desabilitando teste em z
² Incrementa stencil
ð “Desenha” front faces dos volumes
² Desabilitando teste em z
² Decrementa stencil
ð “Desenha” front faces dos volumes
² Habilitando teste em z
² Incrementa stencil se z-teste passar
ð “Desenha” back faces dos volumes
² Habilitando teste em z
² Decrementa stencil se z-teste passar
Deixa valores positivos no stencil qdo observador está
dentro do volume
Shadow volume: z-fail
q Re-odernando as passadas
ð “Desenha” back faces dos volumes
² Desabilitando teste em z
² Incrementa stencil
ð “Desenha” back faces dos volumes
² Habilitando teste em z
² Decrementa stencil se z-teste passar
ð “Desenha” front faces dos volumes
² Desabilitando teste em z
² Decrementa stencil
ð “Desenha” front faces dos volumes
² Habilitando teste em z
² Incrementa stencil se z-teste passar
Shadow volume: z-fail
q Cancelando passadas duplicadas
ð “Desenha” back faces dos volumes
² Habilitando teste em z
² Incrementa stencil se z-teste falhar
ð “Desenha” front faces dos volumes
² Habilitando teste em z
² Decrementa stencil se z-teste falhar
Shadow volume
q Determinação dos volumes de sombra
ð Construção de mapa de elevação
² “Desenha” cena do ponto de vista da fonte de luz
– Z-buffer representa mapa de elevação
² Renderiza mapa de elevação
– Representa os volumes envolventes – Renderização de terrenos
² Problemas
– Aliasing – Eficiência
Shadow volume
q Determinação dos volumes de sombra
ð Representação dos volumes
² Estrutura de dados topológica
– Face: v1, v2, v3, n – Aresta: v1, v2, f1, f2
» Com f1 usando a aresta de v1 para v2 – Vértice: x, y, z
– Não pode conter falhas
² Processamento
– Em relação à fonte de luz e aos objetos
– Para cada face: determina se é back ou front face
» n.L < 0
– Silhueta: para cada aresta, checa orientação das faces vizinhas
» back & front faces
² Determinação do volume
– Faces laterais
» Arestas de silhuetas estendidas até o infinito – Light caps
» Conjunto de front faces – Dark caps
» Conjunto de back faces mapeadas no infinito
Shadow volume
q Trabalhando no infinito
ð Matriz de projeção: zfar → ∞
!!
!!
!!
"
#
$$
$$
$$
%
&
−
−
−− +
−
− +
−
=
!
!!
!!
!!
"
#
$
$$
$$
$$
%
&
−
− −
−
− +
− +
−
− +
−
=
0 1
0 0
2 1
0 0
2 0 0
0 2 0
0 1
0 0
0 2 0
2 0 0
0 2 0
inf
b n t
b t b t
n r l
l r l
r n
n f
fn n
f n f b t
b t b
t
n r l
l r l
r n
P P
Shadow volume
q Trabalhando no infinito
ð Estruturação dos vértices
² x0,y0,z0,1, x1,y1,z1,1,…,xn,yn,zn,0, xn+1,yn+1,zn+1,0,…
q Volume de sombra
ð Light cap: front faces
² v1,v2,v3
ð Faces laterais: quadriláteros
² v1,v1+n,v2+n,v2
ð Dark cap: back faces
² V1+n,v2+n,v3+n
q Dentro do VP
ð If v.w == 0 then
out.pos = MVP * float4(v.xyz * L.w – L.xyz , 0) else
out.pos = MVP * v.xyzw
Shadow Volume na GPU
q Determinação do shadow volume na GPU
ð Quadrilátero degenerado em arestas vivas
² Vértices com normais das faces adjacentes
– Shader transforma “back vertices” para infinito
² Grande número de vértices extras
Desacoplamento: geometria x oclusores
q Possibilita uso de LOD
ð Oclusores com modelos simplificados
² Importante preservar a silhueta
q Problema
ð Auto sombra
² Similar ao que acontece com shadow mapping
Desacoplamento: geometria x oclusores
q Solução
ð Formar volume com orientações inversas
² Front cap: back faces
² Back cap (at infinity): front faces
Volume de sombra convencional
Desacoplamento: geometria x oclusores
q Solução
ð Formar volume com orientações inversas
² Front cap: back faces
² Back cap (at infinity): front faces
Volume de sombra invertido
Visibility for per-pixel lighting
q Visibility set
ð Objetos dentro do frustum de visão: V
q Light sets
ð Objetos dentro do frustum da fonte: Li
q Illumination set
ð I = V ∩ L
q Shadow set
ð H
Visibility for per-pixel lighting
q Algoritmos de múltiplas passadas
ð Primeira passada define z-buffer
² Existem hw acelerados para z-only render
ð Demais passadas
² Uso de query de oclusão
q Stencil para marcar frustum da fonte
ð Após primeira passada (z-buffer definido)
ð Marca stencil com frustum da fonte
² Análogo ao desenho de volumes de sombra
² Só processa pixel com valores de stencil zero (ou 128)