domingo, 5 de julho de 2020

Under the Hood: Explicando o SSAO



Hoje, gostaríamos de explicar um novo recurso gráfico que estamos apresentando aos nossos jogos com a atualização 1.38. O artigo é muito técnico - pedimos ajuda aos nossos programadores, pois a explicação é bastante complexa. No entanto, achamos que pode ser realmente interessante este material - ver que o que está acontecendo sob o capô de um mecanismo de jogo envolve muita pesquisa e trabalho duro de nossos programadores. Além dos detalhes técnicos, pensamos que fornecer o contexto e explicar as compensações de desempenho pode ser útil e importante para a maioria dos jogadores.

Jaroslav a.k.a.Cim
(um de nossos programadores corajosos e qualificados trabalhando em melhorias nos gráficos)

O longo texto abaixo é sobre o Screen Space Ambient Oclusion, uma nova técnica interessante, mas com alto desempenho, para enriquecer a renderização do mundo do jogo. Você não precisa usá-lo se sentir que diminui muito o desempenho ao seu gosto, ou pode gostar e trocar alguns frames por segundo para melhorar a percepção de sombra e profundidade. O efeito pode ser sutil, funciona principalmente no nível de subconsciência, mas depois que você se acostuma, pode ser difícil voltar. É outro marco em nosso plano de melhorias de iluminação / sombreamento que estamos executando agora, a ser seguido pelo novo processamento de luz HDR e pela introdução de superfícies mapeadas mais normais nas próximas atualizações.


A técnica tem suas limitações e peculiaridades. Ele tem sido usado por vários jogos AAA nos últimos anos, e mesmo que não seja perfeito, ajuda o sistema de percepção humana a entender melhor a cena, e esperamos que seja benéfico adicioná-lo ao "mix" de tecnologias em nossos simuladores de caminhão. Sem dúvida, quereremos introduzir maneiras adicionais de sombrear a computação que a melhorarão ou até a substituirão.



Estamos sob pressão constante para melhorar a aparência do nosso jogo. Ao mesmo tempo, há sempre um desejo de acelerar os jogos. Além dessas solicitações, às vezes, concorrentes da base de jogadores, nosso departamento de arte está sempre ansioso por adquirir novos brinquedos gráficos para tornar nosso jogo mais rico e melhor. Sempre que introduzimos um novo recurso gráfico no jogo, tentamos fazê-lo de uma maneira que não prejudique o desempenho de jogadores com computadores mais antigos, não queremos tornar o jogo incompatível para nossos clientes existentes. É por isso que existe uma opção para desativar completamente o SSAO e várias configurações para sua qualidade / desempenho.



O trabalho de nossos programadores nas novas técnicas SSAO / HBAO também exigiu alterações em nosso pipeline de criação de arte. Todos os modelos 3D em nossos jogos tiveram que ser revisados pelo departamento de arte, e todos os casos em que sombras falsas e escurecimentos já foram aplicados a um modelo por um artista foram alterados. Para alguns modelos de jogos mais complexos, essa foi uma simplificação que realmente reduziu o número de triângulos neles o suficiente para melhorar o desempenho da renderização. Até certo ponto, negociamos uma parte do esforço manual futuro que seria necessário para criar modelos 3D de boa aparência individuais para um passe de renderização algorítmica que unifica a aparência sombreada de toda a cena, ajudando a "enraizar" objetos como edifícios, postes de iluminação e vegetação para o terreno.









O que o SSAO representa e como funciona?

Antes de começarmos - observe que SSAO é um acrônimo geral para "oclusão ambiental do espaço da tela - screen space ambient occlusion". O nome abrange todas as várias técnicas de oclusão ambiental - ambient occlusion (AO) e suas variantes que funcionam no espaço da tela (significa que elas obtêm todas as informações em tempo de execução a partir de dados que são renderizados na tela do computador e em buffers de memória relacionados). Há SSAO (tecnologia Crytech 2007 que basicamente deu um nome geral a todas as técnicas), MSSAO, HBAO, HDAO, GTAO e muitas outras técnicas, cada uma usando abordagens ajustadas de maneira diferente, cada uma com seus benefícios e desvantagens. Baseamos nossa abordagem em uma técnica baseada no horizonte chamada GTAO, que foi introduzida em um artigo de 2016 pela Activision.

A parte do nome da oclusão ambiental - ambient occlusion (AO) significa que avaliamos a quantidade de luz que entra (predominantemente a luz do céu, mas às vezes a oclusão calculada é aplicada também a outras luzes) fica ocluída em um local específico no mundo do jogo. Imagine que você está de pé em terreno plano - você veria o céu inteiro acima, então há 0% de oclusão, o chão fica totalmente iluminado pelo céu. Agora imagine que você está no fundo de um poço - você veria apenas um pequeno pedaço do céu, o que significa que o céu fica ocluído quase 100% e contribui apenas um pouco para a iluminação ambiente naquele poço, e naturalmente está bastante escuro o fundo do poço. Um nível específico de oclusão ambiental em um local específico afeta os cálculos de iluminação e cria áreas sombreadas em vincos, buracos e outros locais 'complexos'. Pode chegar entre 0% e 100% com base no ambiente.





Computar a oclusão com alto detalhe e precisão consome muitos recursos; basicamente, você precisaria disparar raios de qualquer posição avaliada em todas as direções e testar se eles atingem o céu ou não e, em seguida, calcular a média do resultado. Quanto mais raios você disparar, melhores informações serão obtidas, mas com um custo de computação maior. Esse processo pode ser processado off-line, como quando o mapa do jogo é salvo pelo seu designer. Alguns jogos e mecanismos usam essa abordagem. Porém, dessa maneira, você só pode obter informações de oclusão ambiental sobre objetos estáticos que não se movem porque não há veículos, nem objetos animados presentes naquele momento.

Portanto, em vez de incluir informações estáticas (que também levariam muito tempo e espaço de armazenamento, dada a escala do nosso mapa do mundo), queremos calculá-las em tempo real, em tempo de execução. Dessa forma, podemos calculá-lo também para interação com veículos, aberturas em pontes, objetos animados e assim por diante. Há uma pegadinha embora. Para essa abordagem de computação, temos apenas dados visíveis na tela (lembre-se de "espaço na tela"); portanto, uma vez que parte do mundo do jogo sai do quadro visível, ele não pode ser usado para avaliação de oclusão. Essa limitação cria vários artefatos, como o desaparecimento da oclusão em uma parede causada originalmente por um objeto que ficou atrás da borda da tela e, assim, ficou invisível não apenas para você, mas também para o algoritmo, deixando de contribuir para o cálculo da oclusão.





Ok, agora sabemos o que avaliar (oclusão ambiental) e sabemos quais dados temos (o que vemos na tela). O que nós fazemos? Bem, para cada pixel na tela (ou seja, 2 milhões de pixels em resolução HD, quatro vezes na escala de 400%), Nosso código de sombreador precisa consultar o valor do z-buffer dos pixels ao redor, tentando obter uma noção de a forma geométrica da área ao seu redor. Podemos fazer apenas um número limitado desses "ajustes", pois há um custo de desempenho cada vez maior com o aumento da contagem de "ajustes". Essa é uma operação que realmente está sobrecarregando o acelerador 3D. O limite do número de ajustes, por sua vez, afeta a precisão da oclusão do ambiente (e em certas situações pode criar imprecisões e faixas). Imagine que você deseja avaliar o ambiente em uma linha reta de 2 metros e está disposto a fazer 8 ajustes para aproximar o objeto. Você consulta a linha a cada 25 centímetros, e qualquer detalhe menor do que isso pode ser totalmente despercebido, a menos que você tenha sorte e acerte no local (ou azar, porque você pode perder a cena seguinte, para que os arredores pareçam mudar repentinamente quadros e causar tremulação). Quanto mais o seu algoritmo detecta, menos preciso ele é. Portanto, você precisa limitar o tamanho de uma área que analisa em torno de cada pixel do jogo, o que limita a distância que o AO 'vê' - é por isso que não é adequado para calcular a oclusão em grandes espaços, como os arcos das pontes.





Mencionamos que a técnica de nossa escolha é baseada no horizonte. Isso significa que não estamos investigando o ambiente disparando raios no mundo 3D. Em vez disso, analisamos um hemisfério acima / ao redor de cada pixel para ver até que ponto ele se abre até ser bloqueado, quanta luz é deixada entrar pela geometria ao redor usando o z-buffer como nosso proxy. Na verdade, o hemisfério é aproximado por várias execuções ao longo de uma linha girada em torno do pixel especificado. Se pudermos acompanhar esse hemisfério por completo, não haverá oclusão. Se o algoritmo digitar um valor no z-buffer que bloqueie a luz recebida, ele definirá o nível de oclusão. O algoritmo é otimizado para desempenho, mas sua limitação é que, uma vez atingido qualquer coisa, mesmo um pequeno objeto, ele pára de sondar mais. Isso pode causar um problema de "excesso de oclusão" e pode ser identificado como um artefato visual quando algum objeto relativamente fino, como um poste de sinalização de trânsito, causa forte oclusão em uma parede próxima. Você pode tentar detectar esses objetos pequenos e ignorá-los, que por sua vez podem produzir "sob oclusão" em bordas finas. Optamos pelo primeiro.





Há também outra propriedade interessante e útil das técnicas baseadas no horizonte. Dependendo de quanto de um hemisfério acima de um determinado pixel está ocluído, é possível calcular a direção menos ocluída. A quantidade de oclusão pode ser pensada como uma casquinha de sorvete com ângulo de vértice variável orientado nessa direção. Essa direção é chamada de "normal dobrado" e a usamos para vários cálculos de luz, como para ocultar um reflexo em superfícies brilhantes. A ideia é que, se você olhar para a superfície e a direção refletida no espelho sair deste cone, consideraremos (pelo menos parcialmente) ocluído, diminuindo a intensidade do reflexo. A melhor maneira de ver esse efeito é observar peças cromadas maiores e redondas, como os tanques de diesel, com o SSAO ligado e desligado.





Então, veja bem, a ideia não é tão difícil para um programador gráfico especializado, mas há muita computação envolvida, colocando bastante pressão no acelerador 3D. Por isso, criamos vários perfis de desempenho, cada um usando uma combinação de técnicas de otimização:
  • Usando menos toques por direção - é mais rápido, mas permite que o AO perca objetos maiores do que com uma amostragem mais fina;
  • Reprojetar resultados de AO do quadro anterior - permite ocultar os artefatos da subamostragem, mas pode criar fantasmas quando a re-projeção falha (quando o que você vê entre os quadros muda muito);
  • Renderização em meia resolução - reduz o número de cálculos para 1/4, mas cria uma AO menos fina - o resultado pode ser um pouco sombreado.
Esperamos que todas essas informações sejam interessantes e úteis para você. Enviaremos um high-five virtual se você ler este artigo até este ponto. Você merece um biscoito e uma xícara grande de chocolate quente! Se você ainda deseja obter mais detalhes sobre este tópico, sinta-se à vontade para verificar este arquivo.

Obrigado pelo seu tempo e apoio, e nos veremos novamente em alguns dos próximos artigos da seção " Under the Hood" que trazemos para o nosso #BestCommunityEver de tempos em tempos.

Fonte.: SCS Software

Um comentário:

  1. Parabéns aos programadores da SCS. Isso vai deixar a imersão tanto no ETS 2 como no ATS bem mais realistas.

    ResponderExcluir