renderização em tempo real departamento de informática - puc-rio setembro de 2007 mapeamento de...
TRANSCRIPT
Renderização em Tempo RealRenderização em Tempo Real
Departamento de Informática - PUC-RioSetembro de 2007
Mapeamento de SombrasMapeamento de Sombras
(Shadow Mapping)(Shadow Mapping)
Vitor Barata Ribeiro Blanco [email protected]
ProgramaPrograma
Introdução Importância das sombras Exemplos
Pré-requisitos Transformação perspectiva Textura projetiva
Mapeamento de sombras Idéias iniciais Algoritmo Vantagens e desvantagens
Problemas, soluções e melhorias Projeção traseira Auto-sombreamento Serrilhamento e filtragem
Técnicas avançadas
Importância das SombrasImportância das Sombras
Esclarecimento das relações espaciais entre os objetos Realismo Beleza estética Jogos: Atmosfera e informações adicionais Visualização científica: Facilidade de compreensão do
modelo
Sombras abruptas e suavesSombras abruptas e suaves
Sombras Abruptas (hard shadows) Fonte de luz pontual
Sombras suaves (soft shadows) Fonte de luz com área Duas regiões: umbra e penumbra
Exemplo sem sombrasExemplo sem sombras
Exemplo com sombrasExemplo com sombras
Exemplo: Luxor Jr. (SM)Exemplo: Luxor Jr. (SM)
Exemplo: Doom 3 (SV)Exemplo: Doom 3 (SV)
Exemplo: Bioshock (SM)Exemplo: Bioshock (SM)
ProgramaPrograma
Introdução Importância das sombras Exemplos
Pré-requisitos Transformação perspectiva Textura projetiva
Mapeamento de sombras Idéias iniciais Algoritmo Vantagens e desvantagens
Problemas, soluções e melhorias Projeção traseira Auto-sombreamento Serrilhamento e filtragem
Técnicas avançadas
Transformação PerspetivaTransformação Perspetiva
Frustum de visão:
Transformação PerspectivaTransformação Perspectiva
Resolução em (x,y,z): Quanto mais distante, menor a resolução!
P
y1
y2
y1’
y2’
y1 = y2y1’ << y2’
Textura ProjetivaTextura Projetiva
Projeção de imagens sobre superfícies Analogia: projetor de slides
Projective Texture MappingCass Everitt - nVidia
Textura ProjetivaTextura Projetiva
Geração automática de coordenadas Combinação linear (distância a um plano)
Espaço do objeto Equação do plano: [a,b,c,d] T
Coordenada gerada: s = axobj+byobj+czobj+dwobj
Espaço do olho Equação do plano: [a,b,c,d] T
Plano transformado: [a’,b’,c’,d’] T = (VM)-T [a,b,c,d] T
Coordenada gerada: s = a’xeye+b’yeye+c’zeye+d’weye
Transformação de coordenadas: [s’,t’,r’,q’]T = Mtex [s,t,r,q]T
Textura ProjetivaTextura Projetiva
Obtendo coordenadas projetadas: Para visualização na tela:
Para projeção em textura:
MundoObjeto Olho Clip TelaM Vcam Pcam viewport
[-1..1] [0..size]
MundoObjeto Projetor Clip TexM Vproj Pproj
[-1..1] [0..1]
T½S½
Textura ProjetivaTextura Projetiva
Gerando coordenadas com o projetor no espaço do olho:
[s’,t’,r’,q’]T = Mtex [xeye,yeye,zeye,weye]T
Mtex = T½S½PpVpVc-1
Vc-1: inversa da matriz de visualização da câmera
Vp: matriz de visualização do projetor
Pp: matriz de projeção do projetor
T½S½: transformação do espaço de clip para o da textura
MundoObjeto
Olho Clip TelaVc-1
Projetor Clip TexVpPp T½S½
Textura ProjetivaTextura Projetiva
Explorando a geração automática de coordenadas no espaço do olho:
Planos como linhas da matriz identidade: ps =[1,0,0,0] => s = x pt =[0,1,0,0] => t = y pr =[0,0,1,0] => r = z
Se a matriz modelview VM = I [s,t,r]T = [xeye,yeye,zeye]T
Se VM = Vc
As equações dos planos são multiplicadas por Vc-1
[s,t,r]T = Vc-1[xeye,yeye,zeye]T = [xobj,yobj,zobj]T
Podemos usar Mtex = T½S½PpVp
Textura ProjetivaTextura Projetiva
Alternativa As equações dos planos funcionam como linhas de uma
matriz que transforma [xeye,yeye,zeye,weye]T
Podemos considerar essa matriz já multiplicada por T = T½S½PpVp:
ps =[T00,T01,T02,T03] pt =[T10,T11,T12,T13] pr =[T20,T21,T22,T23]
Finalmente, mantemos Mtex = I
ProgramaPrograma
Introdução Importância das sombras Exemplos
Pré-requisitos Transformação perspectiva Textura projetiva
Mapeamento de sombras Idéias iniciais Algoritmo Vantagens e desvantagens
Problemas, soluções e melhorias Projeção traseira Auto-sombreamento Serrilhamento e filtragem
Técnicas avançadas
Mapeamento de SombrasMapeamento de Sombras
Idéias iniciais: Se nos colocarmos no local da fonte de luz, toda a cena
visível fica iluminada, sem sombras As superfícies iluminadas são, então, aquelas que podem
ser “vistas pela fonte de luz” Considerando uma fonte tipo spot, poderíamos usar um
“mapa de luz” como textura projetiva para causar o efeito de iluminação
Problema A textura projetiva ignora obstáculos, além de ser projetada
também para trás Apenas o primeiro obstáculo, aquele mais próximo da fonte
de luz, deveria ser iluminado
Mapeamento de SombrasMapeamento de SombrasAlgoritmoAlgoritmo
Renderizar a cena vista pela fonte de luz
Armazenar z-buffer em uma textura (mapa de sombras)
Renderizar a cena vista pela câmera
Transformar pixels para o espaço da luz (s,t,p,q)
zmapa = acesso em s/q e t/q zpixel = p/q Fragmento iluminado se
zpixel <= zmapa
Mapeamento de SombrasMapeamento de SombrasPassosPassos
Fonte das imagens: Wikipedia
Cena inicial sem sombrasPonto-de-vista da fonte de luz
Mapa de profundidadesMapa de sombras projetado
Resultado do teste de zCena final com sombras
Suporte em HardwareSuporte em Hardware
Pipeline convencional:glTexImage2D (GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, mapWidth, mapHeight, 0, GL_DEPTH_COMPONENT, GL_FLOAT, NULL);
// Filtering can be enabled on Nvidia, disabled otherwiseglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); // GL_LINEARglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); // GL_LINEAR
//Enable shadow comparisonglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_R_TO_TEXTURE);
//Shadow comparison should yield true (not in shadow) if r <= textureglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC, GL_LEQUAL);
//Shadow comparison should generate a LUMINANCE result (rgb = 0 or 1) glTexParameteri(GL_TEXTURE_2D, GL_DEPTH_TEXTURE_MODE, GL_LUMINANCE);
//Clamp to avoid shadow replicationglTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, borderInLightOrNot)glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);
Suporte em HardwareSuporte em Hardware
GLSL:
CG:
Podem-se programar filtros (Percentage-CloserFilter, PCF) melhores que o padrão da Nvidia, além de outras técnicas avançadas
// Shadow map sampleruniform sampler2DShadow ShadowMap;
// Get Shadow resultvec4 shadowTest = shadow2DProj(ShadowMap, gl_TexCoord[1])
tex2Dproj (sampler2D tex, float3 sq);
Vantagens e DesvantagensVantagens e Desvantagens
Mapeamento de Sombras Vantagens:
Simples de implementar Relativamente simples de integrar Não requer conhecimento da geometria da cena Suporte total em hardware Sombras suaves (soft shadows) como extensão direta Adequado a qualquer primitiva que marque o z-buffer Custo baixo e controlável com técnicas comuns de culling e LOD
Desvantagens: Problema de auto-sombreamento incorreto Problema de serrilhamento (aliasing) acentuado Difícil estender para luzes pontuais onidirecionais
Vantagens e DesvantagensVantagens e Desvantagens
Volumes de Sombras Vantagens:
Ausência de serrilhamento, hard-shadows perfeitas Problema de auto-sombreamento facilmente tratável Estende-se naturalmente para fontes pontuais onidirecionais
Desvantagens: Requer maior esforço de implementação e integração Requer análise da geometria da cena Custo pode ser alto na análise da geometria e na rasterização dos
volumes de sombra Suporte em hardware apenas com geometry shaders em DX10 /
OpenGL 2.1 Adequado apenas a primitivas poligonais, sem efeitos por pixel como
displacement maps e alpha-test transparency.
Idéias adicionaisIdéias adicionais
O mapa de sombras tradicional não depende do observador Luzes e objetos estáticos:
Reaproveitamento o mapaExplorar a coerência quadro-a-quadro
Objetos dinâmicos:Usar um mapa de sombra para os objetos
dinâmicosUsar outro mapa, ou mesmo uma técnica
diferente, para os objetos estáticos
ProgramaPrograma
Introdução Importância das sombras Exemplos
Pré-requisitos Transformação perspectiva Textura projetiva
Mapeamento de sombras Idéias iniciais Algoritmo Vantagens e desvantagens
Problemas, soluções e melhorias Projeção traseira Auto-sombreamento Serrilhamento e filtragem
Técnicas Avançadas
Projeção reversa e ReplicaçãoProjeção reversa e Replicação
Replicação das sombras Pode ocorrer fora do espaço do mapa [0..1] Clamp, borda em sombra (spot) Clamp, borda iluminada (pontual e direcional)
Projeção reversa Pode ocorrer se tratarmos luzes pontuais como spot
para o mapeamento de sombras Utilizar textura 1D com 2 texels Geração automática de coordenadas
À frente da luz: s < 0.5 Atrás da luz: s > 0.5
Combinar com multi-textura
Resolução do Mapa de SombrasResolução do Mapa de Sombras
Tanto o mapa de sombras quanto a imagem final são representações amostradas da cena
Volumes de visão conflitantes: Amostragem não-uniforme da
transformação perspectiva Baixa amostragem do mapa longe da
fonte de luz Necessária alta amostragem próximo
à câmera
Visã
o d
a câ
mera
Visã
o d
a
fon
te
Figura extraída de: C. Everitt, Shadow Mapping, NVidia Corporation
Auto-sombreamento incorretoAuto-sombreamento incorreto
Auto-sombreamento incorretoAuto-sombreamento incorreto
Origens do auto-sombreamento Precisão numérica Representação discreta e desalinhamento de amostras Pior caso: dueling frusta Solução básica: acrescentar um pequeno valor de bias aos
valores armazenados no mapa
Auto-sombreamento incorretoAuto-sombreamento incorreto
Acréscimo de deslocamento generalizado [Weiskopf03]
zmapa = z1 + zbias(z1,z2)
Bias constante: zbias = offset[Williams78]
Second-depth: zbias = z2-z1[Wang94]
Midpoint: zbias = (z2–z1) / 2 [Woo92]
Dual: zbias = min(zmid,zmax) [Weiskopf03]
Bias constante requer ajuste caso-a-caso, mas é suficiente na maioria dos casos
Second-depth restrito a sólidos fechados Gerar mapa com backfaces
Dual produz ótimos resultados, mas usa duas passadas de geração
Auto-sombreamento incorretoAuto-sombreamento incorreto
Outras idéias Melhorar o ajuste do volume de visão da fonte de
luz à cena Forçar uma variação linear (não hiperbólica) nos
valores de z do mapa Coordenada de textura + shader
Ao invés de um mapa de profundidades, utilizar um mapa de IDs codificados em cores IDs por polígonos causa artefatos nas interfaces IDs por objetos impede que gerem sombras corretas
sobre si próprios
Auto-sombreamento incorretoAuto-sombreamento incorreto
Alinhamento de amostras Problema de reconstrução 2D
Amostras do mapa de sombras?Amostras da câmera?
Alinhamento de AmostrasAlinhamento de Amostras
Interpolação do mapa de sombras não funciona bem
Alinhamento de AmostrasAlinhamento de Amostras
Reconstrução das amostras da câmera [Wang94] Considerar “amostras virtuais” da câmera sobre o plano
tangente à superfície obter a equação do plano tangente com o ponto (vértice) e a normal
(coordenada de textura) Calcular as coordenadas do ponto, sobre esse plano, que se alinha
com a amostra do mapa (shader)
Serrilhamento e FiltragemSerrilhamento e Filtragem
Percentage-Closer FilterPercentage-Closer Filter (PCF) (PCF)
Idéia: Utilizar diferentes amostras do mapa de sombras Realizar vários testes de sombra com resultado
binário (0,1) Filtrar os resultados dos testes
Núcleo: Espaço da imagem: amostras em pixels vizinhos Espaço do mapa: amostras em texels vizinhos
PCF 5x5 no espaço da imagemPCF 5x5 no espaço da imagem
PCF 5x5 no espaço do mapaPCF 5x5 no espaço do mapa
Aprimoramentos ao PCFAprimoramentos ao PCF Eliminação do efeito de faixas (banding)
Amostras com jitter (passado como textura) Quinas mais corretas, sem artefatos
Núcleo circular com preservação de área Eficiência
Amostragem adaptativa (amostras amarelas apenas quando necessário)
maxmax
maxmax
2'
2cos'
xxsenyyRy
xxyyRx
Implementação descrita nos slides do Waldemar e no livro GPU Gems II
PCF 5x5 aprimorado com PCF 5x5 aprimorado com jitterjitter
PCF não-adaptativoPCF não-adaptativoem baixa resoluçãoem baixa resolução
PCF adaptativoPCF adaptativoem baixa resoluçãoem baixa resolução
Artefatos surgem em mapas de baixa resolução devido ao grande núcleo utilizado para o filtro
PCF não-adaptativoPCF não-adaptativoem boa resoluçãoem boa resolução
PCF adaptativoPCF adaptativoem boa resoluçãoem boa resolução
Artefatos menos perceptíveis
ProgramaPrograma
Introdução Importância das sombras Exemplos
Pré-requisitos Transformação perspectiva Textura projetiva
Mapeamento de sombras Idéias iniciais Algoritmo Vantagens e desvantagens
Problemas, soluções e melhorias Projeção traseira Auto-sombreamento Serrilhamento e filtragem
Técnicas Avançadas
Técnicas AvançadasTécnicas Avançadas
Filtragem Mapas de Variância (VSM, 2006) Summed Area VSM (2007)
Reparametrização Perspective Shadow Maps (PSM, 2002) Light-Space PSM (LiSPSM, 2004) Logarithmic Shadow Maps (LogSM, 2006)
Particionamento Particionamento em profundidade ou Cascaded Shadow Maps Particionamento por faces Particionamento em ladrilhos Particionamento Adaptativo (2000) Queried Virtual Shadow Maps (2007)
Interessados, peçam-me as referências por e-mail. Também acrescentarei aos slides assim que possível.
Mapas de VariânciaMapas de Variância
Algoritmo: Armazenar no mapa de sombras os valores de (z) e (z2) de cada
amostra Filtrar as duas componentes por hardware e possivelmente em
shaders Considera-se que as amostras de profundidades no interior do
núcleo do filtro fazem parte de uma distribuição estatística Os valores filtrados podem ser encarados como os valores
esperados E(z) e E(z2) Calcula-se a média e a variância da distribuição:
μ = E(z) = E(z2) − E(z)2
Mapas de VariânciaMapas de Variância
Algoritmo (continuação): Calcula-se, com a desigualdade de Cauchy, a probabilidade
máxima de dado fragmento estar em luz:
Usa-se essa probabilidade para multiplicar o valor da iluminação do fragmento
Problema: vazamento de luz
P(zmapa>=zpixel) <= pmax = 2 / [2 +(t−μ)2]
ReparametrizaçãoReparametrização
Métrica de SerrilhamentoMétrica de Serrilhamento
Consideramos o “erro de serrilhamento” como a razão entre as áreas de uma superfície vistas por um texel do mapa de sombras e por um pixel da imagem:
lc
cl
c
l
w
w
w
wm
cos
cos
'
'
Métrica de SerrilhamentoMétrica de Serrilhamento
Idealmente, queremos m=1 m > 1 serrilhamento m < 1 super-amostragem
Dois tipos de serrilhamento Serrilhamento de perspectiva: wl/wc Serrilhamento de projeção: cos(θc)/cos(θl)
Potencialmente ilimitado Difícil computar Menos notável Não tratado por técnicas de reparametrização
Objetivo: minimizar o erro máximo em todo o campo de visão da câmera: L∞ = max( |wl/wc| )
Reparametrização PerspectivaReparametrização Perspectiva
Idéia: deformar a cena de modo que objetos mais próximos da câmera apareçam com maior área no mapa de sombras
Para a cena original, tudo se passa como se os texels do mapa tivessem seu tamanho alterado
Baixíssimo custo, apenas calcular e multiplicar uma transformação à matriz de visualização da cena
Reparametrização PerspectivaReparametrização PerspectivaCaso ÓtimoCaso Ótimo
Luz incidindo perpendicularmente à direção de visualização
PSM [Stamminger02]: LiSPSM [Wimmer04]: Tradicional:
nfnn '
nn '
'n
Reparametrização PerspectivaReparametrização PerspectivaEfeito da TransformaçãoEfeito da Transformação
Luz incidindo perpendicularmente à direção de visualização
PSM [Stamminger02]: LiSPSM [Wimmer04]: Tradicional:
nfnn '
nn '
'n
ParticionamentoParticionamento
Particionamento por FacesParticionamento por Faces
Com luz e câmera paralelas, nenhuma reparametrização perspectiva é boa simultaneamente para A e C
Idéia formalizada por Lloyd (2006): Gerar um mapa de sombras independente para cada face do
volume de visão da câmera visto pela fonte Aplicar uma transformação perspectiva diferente a cada face
Particionamento em Particionamento em ProfundidadeProfundidade
Lloyd (2006) mostra que o erro de serrilhamento é proporcional a (f/n)
Podemos reduzir o erro máximo utilizando várias partições ao longo do eixo z
O erro é mínimo com partições semelhantes, ou seja, que tenham a mesma razão (f/n)
ExemploExemploIncidência PerpendicularIncidência Perpendicular
Mapeamento Tradicional
Exemplo Exemplo Incidência PerpendicularIncidência Perpendicular
Reparametrização LiSPSM Generalizada
Exemplo Exemplo Incidência PerpendicularIncidência Perpendicular
ReparametrizaçãoParticionamento ZP2
Exemplo Exemplo Incidência PerpendicularIncidência Perpendicular
ReparametrizaçãoParticionamento ZP2
PCF 5x5
Exemplo Exemplo Incidência ParalelaIncidência Paralela
Mapeamento Tradicional
Exemplo Exemplo Incidência ParalelaIncidência Paralela
ReparametrizaçãoLiSPSM Generalizada
Exemplo Exemplo Incidência ParalelaIncidência Paralela
ReparametrizaçãoParticionamento ZP2
Exemplo Exemplo Incidência ParalelaIncidência Paralela
ReparametrizaçãoParticionamento ZP2
PCF 5x5
FIMFIM
Perguntas?