Voxels vs mapas de sombras: escolhendo um novo sistema de iluminação para Roblox





Voxels tem servido como sistema de iluminação no mundo Roblox nos últimos quatro anos. Mas, mais cedo ou mais tarde, chega um momento de mudança em tudo. É por isso que os desenvolvedores se perguntaram o que fazer a seguir.



A iluminação é complicada, então você precisa ter cuidado ao escolher novas tecnologias, pois há muitos fatores a serem considerados. Para facilitar a tomada de decisões, a Roblox criou um protótipo de dois sistemas futuros: os chamados voxels e mapas de sombra. Para entender as limitações de ambos, primeiro é importante entender como funcionam.

Observação: as capturas de tela do artigo são organizadas de forma que os voxels sejam sempre exibidos à esquerda e os mapas de sombras à direita.





Implementação: voxels



Embora este sistema particular funcione no jogo por um longo tempo, a opção considerada aqui passou por muitas melhorias.



Os dados mundiais são convertidos em um conjunto de grades de voxel: cada grade é centrada em torno do personagem e pode ter tamanhos de voxel de 1 a 16 (5 grades no total). Cada voxel contém informações de ocupação que variam de 0 a 100%. Os dados de iluminação para cada voxel em cada malha são então calculados com base nas informações de plenitude e fonte de luz / direção. Tudo isso acontece na GPU, já que a central não é rápida o suficiente para atualizar tantos voxels com uma densidade tão alta.



O sistema armazena todos os dados em voxels, em particular - para cada voxel disponível há dados sobre:



  • Plenitude (vários valores que descrevem a quantidade de cada voxel);
  • Skylight (quanto do céu é visível a partir do voxel);
  • Sombra do sol (quanto do sol é obscurecido pelo voxel);
  • Cores do objeto / cone de luz (aproximação da cor / cone do efeito das fontes de luz locais no voxel).


Essa informação é posteriormente usada para calcular a cor de cada pixel em uma determinada resolução. As resoluções de tela e voxel podem ser ajustadas independentemente uma da outra. Partes da malha voxel podem ser atualizadas quadro a quadro conforme as luzes / objetos se movem.



Implementação: mapas de sombra



imagem



Este método usa rasterização para calcular a maioria dos efeitos de sombra. É realizado em três etapas. Primeiro, para cada casta de sombra, atualizamos o mapa de sombra, lançando várias castas de raios da fonte de luz para a cena e lembrando os resultados da interseção. Em seguida, construímos uma estrutura de aceleração espacial na qual incorporamos cada objeto de luz visível, que é essencialmente uma grade voxel frustocônica (também conhecida como grade froxel).



A grade cobre toda a parte do mundo do jogo vista pela câmera. Em cada froxel, escrevemos uma lista de todos os objetos de luz que o cruzam. Finalmente, para calcular a influência de todas as fontes de luz, ao renderizar a cena para cada pixel, procuramos um froxel que contenha esse pixel, iteramos sobre todas as fontes de luz e para cada luz calculamos sua influência separadamente usando os mapas de sombra construídos na primeira fase.



O sistema armazena dados em duas estruturas:



  • Atlas de sombras (todos os mapas de sombras de luz visível compactados em uma grande textura);
  • Grade de luz (uma grade de froxel que efetivamente transforma um ponto na câmera em uma lista de luzes).


A cor de cada pixel é calculada dinamicamente e não é armazenada explicitamente. Partes do atlas de sombra podem ser atualizadas quadro a quadro conforme as luzes / objetos se movem.



Desempenho: voxels



A técnica de voxel se presta melhor ao dimensionamento: para degradar a qualidade de saída, podemos reduzir o número de grades de voxel ou atualizar menos voxels por quadro (o que resulta em um "atraso de luz" - uma atualização mais lenta da exposição à luz dos objetos em comparação com a atualização dos próprios objetos).



Voxels têm três características de complexidade: complexidade geométrica, complexidade de luz e contagem de pixels. A complexidade geométrica afeta apenas o custo de voxelização, portanto, adicionar mais objetos não causará atrasos. A complexidade da luz afeta apenas o custo de computá-la, que não depende da complexidade geométrica ou do número de pixels. Finalmente, a cor final do pixel é calculada a partir do número de voxels / luzes / objetos, para que possamos dimensionar a resolução sem afetar a qualidade da iluminação.



O desempenho do Voxel é calculado como O (G) + O (L) + O (P), onde G é o número de triângulos (complexidade geométrica), L é o número de luzes, P é o número de pixels.



Infelizmente, o desempenho de pico do voxel não é ideal, pois a contagem do voxel aumenta, pois o N3 e as GPUs não são ideais para os métodos de atualização necessários e não podem manter um bom gerenciamento de desempenho. Com pesquisas suficientes sobre computação de GPU, a perda de desempenho pode ser compensada, mas o custo básico pode permanecer bastante alto no momento.



Desempenho: cartas de sombra



Os cartões de sombra são mais amigáveis ​​à GPU, pois são projetados com base na rasterização. O custo de atualização do shadow atlas pode ser parcialmente reduzido armazenando em cache / atrasando as atualizações (o que logicamente leva a latência adicional). Otimizar a representação da geometria (incluindo o nível de detalhe da malha) também reduz o custo do método.



No entanto, atualizar sombras em cenas complexas ainda é caro, pois o custo depende da quantidade de detalhes geométricos e do número de luzes projetando as sombras. Dentro de um edifício, no caso de uma luz em movimento, todo o edifício precisa ser refeito a cada quadro para atualizar as informações de sombra dessa luz. Muitas projeções de luz em movimento no edifício levam a uma diminuição no desempenho: não podemos atualizar todas as luzes no quadro de uma vez, o que leva a artefatos visuais.



Além disso, este método não permite separar o parâmetro resolução da quantidade de luz: para cada pixel, temos que recalcular a influência de todas as fontes de luz que o cobrem. Esta etapa também não pode ser armazenada em cache, o que leva a problemas de desempenho em altas resoluções em cenas altamente iluminadas: 20 luzes sobrepostas em uma sala de 4K podem exigir estimativas de 160 milhões de luz.



O desempenho do Shadowmap é calculado como O (GL) + O (LP), onde G é o número de triângulos (complexidade da geometria), L é o número de luzes, P é o número de pixels.



Avaliação de desempenho



Para maior clareza, ambos os métodos foram usados ​​para níveis de jogo especialmente selecionados. Observe que essas são implementações de nível pré-existentes e não foram projetadas especificamente para avaliação de desempenho.





Paris (sombras do sol, muito poucas fontes de luz sem sombra)







  • Voxels: atualização de sombra - 6ms, renderização de cena - 1,5ms;
  • Mapas de sombra: atualização de sombra - 1 ms, renderização de cena - 2,4 ms;
  • O custo de calcular a sombra do voxel base é maior porque é mais difícil para a GPU processar.


Cavernas (muitas fontes que projetam sombras)







  • Voxels: atualização de sombra - 7 ms, renderização de cena - 0,9 ms;
  • Mapas de sombra: atualização de sombra - 10 ms, renderização de cena - 2,1 ms;
  • Devido à grande quantidade de geometria e luzes móveis, atualizar os mapas de sombras é caro.


Western (muitas fontes de projeção de sombras)







  • Voxels: atualização de sombra - 8 ms, renderização de cena - 1 ms;
  • Mapas de sombra: atualização de sombra - 15 ms, renderização de cena - 2,5 ms;
  • Com luzes móveis e muitos triângulos, atualizar o mapa de sombras é caro.


1000 fontes de luz sem sombra







  • Voxels: atualização leve - 20ms, renderização de cena - 0,5ms;
  • Mapas de sombra: atualização de luz - 0,5 ms, renderização de cena - 5 ms;
  • A quantidade cumulativa de luz e sobreposição de voxel neste caso retarda a atualização do voxel. Além disso, você pode ver que no estágio próximo, a aproximação para “uma luz em cada voxel” não é realizada.


Desempenho: conclusão



Os mapas de sombra são bem dimensionados para a carga de trabalho, mas há duas coisas a serem consideradas:



  • O custo por pixel aumenta conforme a resolução aumenta, tornando esta uma solução prática apenas em resoluções médias (1080p); ir além de 1080p requer uma GPU muito boa.
  • O custo de renderizar sombras cresce muito rapidamente no caso de geometria complexa com muitas luzes dinâmicas. Isso pode ser compensado por um melhor abate, mas neste estágio continua sendo um problema fundamental.


Ao mesmo tempo, ao contrário, o desempenho do voxel é muito menos dependente do conteúdo do nível, mas tem um custo base muito mais alto. Isso pode ser compensado por algoritmos de GPU aprimorados e voxels reduzidos.



Requisitos de memória



Os requisitos de memória para mapas de sombras e voxels dependem da qualidade exigida.



No caso dos voxels, várias texturas são armazenadas na memória para cada estágio, portanto seu tamanho total depende do número de estágios e do tamanho de cada um deles. Atualmente, existem 4 estágios (com tamanhos de voxel 1..8) de 128x64x128 voxels cada, o que soma 128 MB de VRAM usados. Seria possível criar mais 2 cascatas (0,5 voxels e 16 voxels) ou reconfigurar as existentes, o que aumentaria esse valor para 192 MB. Por outro lado, você pode reduzir o número de cascatas (removendo algumas cascatas próximas) em sistemas com memória limitada, e então o impacto mínimo na memória pode ser cerca de 64 MB com duas cascatas (4..8) e cerca de 96 MB com três (4 .. dezesseis).



No caso de mapas de sombra, um atlas de mapa de sombra e uma grade de Froxel são usados. Este último depende parcialmente da resolução. O tamanho do atlas de sombra, por sua vez, pode ser reduzido se você precisar reduzir a qualidade das sombras para melhorar o desempenho / memória. O sistema atual usa 73 MB de memória de vídeo, a maior parte (64 MB) ocupada pelo atlas sombra. Você pode reduzi-lo e, assim, limitar o número de luzes escurecidas ou a qualidade das sombras. Você também pode considerar algumas opções para mapas de sombra que requerem mais memória para suportar translucidez, o que significa que ocuparão mais espaço (até 130 MB ou mais). É provável que o impacto mínimo na memória do sistema seja obtido reduzindo o tamanho do atlas sombra e usando sua versão mais simples, que ocupará cerca de 25 MB.



Em comparação, o sistema de iluminação atual possui dois modos: alta qualidade (PC) e baixa qualidade (móvel). A versão para PC ocupa cerca de 40 MB (24 MB de RAM, 16 MB de VRAM); móvel - ~ 11 MB (6 MB RAM, 5 MB VRAM).



Na verdade, os dois métodos são bastante próximos em termos de impacto na memória, mas os mapas de sombra são um pouco mais escalonáveis ​​para o mesmo intervalo de luz / sombra.



Compatibilidade móvel



O público do jogo está se tornando cada vez mais móvel, o que significa que ao comparar as implementações selecionadas, diferentes dispositivos de jogo também devem ser levados em consideração. Em dispositivos de última geração, deve haver recursos de API suficientes para implementar os dois métodos, mas é claro que eles podem não ser tão práticos em termos de memória e desempenho.



O sistema de iluminação voxel existente é ótimo para dispositivos móveis: ele suporta muitas funções de iluminação complexas (sombras claras, claraboia, etc.) e executa a maioria dos cálculos complexos na CPU, fornecendo assim requisitos mínimos para o desempenho da GPU e conjunto de recursos ... Como esse sistema ainda precisará ser compatível com dispositivos móveis e PCs de baixo custo no futuro próximo, surgiram várias opções para oferecer suporte a um grande conjunto de dispositivos:



  • Salve o sistema existente em um formulário móvel, o novo será apenas PC / console. Isso significa que um grande segmento da base de usuários não terá acesso ao novo sistema.
  • ( , ), /.
  • low-end , , .


Em todos esses casos, é necessário responder à pergunta sobre compatibilidade de conteúdo, pois uma das principais promessas da plataforma é “baixar o conteúdo uma vez e rodar em qualquer lugar”. Ainda precisamos trabalhar nisso. À primeira vista, parece que a nova solução de voxel é melhor no sentido de que fornece consistência de qualidade / comportamento do sistema antigo para o novo, enquanto os mapas de sombra representam uma transição mais abrupta para outra qualidade, mas ao mesmo tempo são mais propensos a se darem bem com recursos limitados em dispositivos móveis.



Qualidade: fontes de luz



A solução de mapa de sombra fornece informações confiáveis ​​em termos de simulação de fontes de luz: na imagem abaixo com 1000 luzes no caso de mapas de sombra, você pode ver realces especulares perfeitamente reproduzidos - modelados com BRDF, que nos dá os reflexos de luz desejados.



A solução do voxel é fundamentalmente pior porque aproxima o efeito da luz em cada voxel como se viesse de apenas uma fonte. A partir disso, você pode ver que a qualidade da reflexão especular se deteriora:







então, no caso de voxels na área com realces especulares, as cores se fundem em uma proporção de 1: 1, criando luz amarela em vez de verde e vermelha, embora não haja luzes amarelas na cena. Em contraste, a solução do mapa de sombra simula com precisão a combinação de cores.



Em alguns casos, obtemos resultados muito pouco convincentes, embora possam ser melhorados no futuro:







no exemplo acima, você pode ver realces espelhados curvos, alongados e distorcidos, e em vários voxels sob um dos objetos não há nenhuma informação de luz. A mesma captura de tela para mapas de sombra oferece um resultado muito melhor.



Qualidade: sombra



A qualidade definidora dos mapas de sombras é a precisão, enquanto as sombras de voxel são suaves. Os mapas de sombras fornecem sombras nítidas com o mínimo de detalhes possível, mas precisos o suficiente para criar uma sombra convincente para o personagem. Por outro lado, o algoritmo de voxel é muito bom para criar sombras realmente suaves, mas as sombras de pequenos detalhes não são registradas ou têm um formato irregular.







Por esse motivo, uma variante do mapa de sombras é usada atualmente para renderizar sombras de personagens - no entanto, é mais uma muleta, aplicada apenas ao sol projetando sombras de personagens. Outras fontes de luz não são levadas em consideração.



Além disso, uma técnica chave para acelerar voxels é usar cascatas. No entanto, isso significa que os dados de plenitude se tornam mais grosseiros à medida que a distância do ponto na cena é de interesse para nós. Nesse caso, a qualidade da sombra também se deteriora à medida que a distância entre a fonte e o receptor da sombra aumenta:







na captura de tela acima, o tamanho do menor voxel seria suficiente para renderizar uma sombra de alta qualidade da ponte, mas a ponte está muito longe da superfície da água, então seus voxels acabam sendo muito ásperos mesmo quando desde que os voxels próximos à superfície da água sejam bastante bons.



Qualidade: clarabóia



Uma função importante no pipeline de voxel é o cálculo do coeficiente de claraboia, que determina quanto do céu é visível a partir do voxel atual. É usado para misturar iluminação interna e externa e é muito eficaz para melhorar sua qualidade. Na captura de tela abaixo, o exterior da casa deve ser muito mais claro do que o interior, mesmo em áreas que estão na sombra. A solução de voxel calcula e reproduz bem este coeficiente, mas no caso de um mapa de sombras ele está ausente, portanto não há possibilidade de escurecer as sombras.







Qualidade: precisão geométrica



Vale a pena observar as diferenças fundamentais na representação da geometria entre voxels e mapas de sombras.



Os voxels assumem que todos os objetos suportados pelo motor de luz podem ser "voxelizados" - ou seja, para cada voxel no mundo do jogo, há uma maneira rápida de calcular a quantidade de interseção entre o objeto e o voxel. Isso funciona bem para formas primitivas, mas objetos complexos como CSGs e MeshParts já são um problema sério. Agora, a decomposição bruta e um conjunto de outros hacks para voxelização eficaz ajudam em parte com isso, mas geralmente leva a artefatos visíveis. Ao mesmo tempo, os mapas de sombra usam a mesma representação poligonal que está envolvida na renderização, para que possam representar perfeitamente as formas de todos os objetos:







Qualidade: vazamentos de luz



Embora a forma da sombra seja extremamente importante, talvez seja ainda mais importante que os pixels invisíveis sejam tratados de maneira adequada. Quando várias aproximações violam isso, ocorrem os chamados vazamentos de luz - listras visíveis, que causam a maioria dos problemas em ambientes de alto contraste - por exemplo, dentro de um edifício com um sol forte do lado de fora. Aqui está um exemplo de vazamento de luz:







Esta é uma seção fina e iluminada do chão bem contra a parede. Mapas de sombra preservam a oclusão de luz muito melhor e combatem esse problema.



Existem várias fontes de vazamentos de voxels. Alguns deles podem ser suavizados mantendo a plenitude anisotrópica: por exemplo, agora a memória armazena 3 valores por voxel, indicando “quanta matéria há na projeção do voxel ao longo do eixo” para todos os três eixos. Infelizmente, embora isso ajude os detalhes sutis a projetar sombras, independentemente de sua espessura, não corrigirá todos os vazamentos. A única forma de garantir o bloqueio total da luz nesse aspecto é deixar a parte duas vezes mais espessa que o voxel. Além disso, o vazamento aumenta com o tamanho do voxel, o que significa que se torna mais perceptível em níveis de qualidade mais baixos e / ou mais distantes.



Os mapas de sombra não são completamente selados, mas vazamentos neles são um problema muito menor - por exemplo, nesta implementação, um objeto com espessura de 0,4 voxels não transmitirá luz visível (com espessura de 0,2 voxels, pode transmitir parte da luz, mas também desta você pode se livrar no futuro).



Qualidade: conclusão



Os cartões sombra são excelentes na maioria dos aspectos de qualidade. A única área de subsidência significativa é o cálculo da proporção da claraboia. Isso pode exigir um método híbrido que usa voxelização para a claraboia, o que introduz alguns empecilhos ao pipeline do voxel - ou talvez haja soluções alternativas para esse problema. Também seria bom ser capaz de suportar sombras suaves, o que pode ser feito com algumas extensões do algoritmo do mapa de sombra.



Voxels fornecem qualidade aceitável, mas perdem muito em comparação com mapas de sombras, especialmente na fidelidade das sombras e realces especulares. Teremos que resolver de alguma forma esses problemas para podermos implementar iluminação voxel que pode fornecer belas sombras ao jogador, pois o uso da solução atual dá aquelas apenas do sol, o que parece incompatível com a visão futura do mundo no jogo.



Visibilidade: translucidez



Renderizar sombras é um problema bastante pesquisado para objetos opacos, mas a translucidez é outra questão completamente. Uma vez que, no caso de um sistema de voxel, a luz viaja através das células de voxel com base no valor de plenitude, não é muito difícil manter sombras semitransparentes que sombras de baixa frequência (suaves) de efeitos de partículas e outros objetos semitransparentes na cena podem fornecer, incluindo autossombreamento para os próprios efeitos de partícula:







Abaixo está um vídeo desse efeito em movimento:





Atualmente, não há suporte para translucidez para mapas de sombra. Isso significa que se quisermos suportar partículas ou outros objetos transparentes que projetam sombras, outra solução deve ser encontrada. Existem algumas pesquisas para representações alternativas de mapas de sombras que podem servir a esse caso de uso, mas ainda não se sabe como isso é eficaz.



Visibilidade: vegetação



Embora os mapas de sombra não façam um trabalho particularmente bom com translucidez, eles podem mostrar detalhes finos em objetos (como vegetação), sejam modelados com geometria ou texturas. Os voxels não são pequenos o suficiente para atender a esse caso de uso. Além disso, neste caso, não é fácil acessar as informações sobre a textura, pois isso requer uma modelagem precisa da superfície da malha, e não do volume. É duvidoso que algum dia seja possível obter belas sombras da vegetação usando voxels, ao passo que os mapas de sombras podem fornecer isso mesmo com o conteúdo existente, como mostrado nesta captura de tela:







Visibilidade: autoiluminação



Devido à forma como os voxels são implementados, é relativamente fácil injetar luzes de forma e quantidade arbitrárias na malha sem afetar o desempenho de outras partes da tubulação. No entanto, embora você adicione muitas luzes aos mapas de sombras, criar luzes com formas irregulares apresenta alguns problemas arquitetônicos e de desempenho. Em particular, é muito mais fácil perceber a verdadeira autoluminosidade com voxels: o material neon é usado atualmente para "emitir luz", mas na verdade não emite luz para outros objetos próximos.







Sim, você pode adicionar luzes adicionais, mas seria bom fazer tudo automaticamente. Os mapas de sombra não são muito úteis para isso, mas os voxels suportam a voxelização de qualquer forma por necessidade e, portanto, é muito fácil suportar a emissão de luz de objetos auto-luminosos com eles.



Visibilidade: iluminação global



A iluminação global (GI) se refere ao cálculo dos efeitos de iluminação secundária, como a luz de uma lâmpada refletindo duas vezes nas paredes para fornecer iluminação adicional em áreas onde os raios de luz diretos não podem alcançar.



GI em Roblox é extremamente complexo, e a maioria das decisões sobre isso tem que sacrificar algo de iluminação dinâmica, geometria dinâmica, performance, cenas de grande escala. Qualquer um desses sacrifícios é inadmissível.



Não está claro quais soluções de GI seriam práticas, dadas as rígidas restrições de conteúdo. Até agora, GI baseado em voxel parece ser mais promissor do que outras abordagens.



É claro que ter GI baseado em voxel não significa que a iluminação direta é computada usando-os: a maioria das pesquisas GI baseadas em voxel hoje envolve o uso de mapas de sombra para calcular luz direta e melhorar os resultados com voxels.



Resumo



Com base na análise acima, compilaremos uma tabela de resumo sobre a eficácia de ambas as soluções. As células em itálico sugerem que novas pesquisas podem melhorar esta área. A classificação na tabela é a seguinte: Terrível <Fraca <Normal <Boa <Excelente.







Portanto, os voxels são ótimos para modelar iluminação indireta, mas não tão bons quando se trata de iluminação direta. Ao mesmo tempo, eles consomem muitos recursos, o que se correlaciona mal com a tarefa de manter um amplo conjunto de dispositivos.



Isso levou à decisão de criar um sistema de mapa de sombra para iluminação direta. A solução para o problema da claraboia e da iluminação global ainda não foi encontrada de forma inequívoca, mas, muito provavelmente, será uma espécie de híbrido de ambos os sistemas.



All Articles