Geometria

Os jogos 3D que funcionam bem no maior número de dispositivos contam com arte 3D projetada para aproveitar melhor os processadores gráficos. Este guia destaca as otimizações e as práticas recomendadas para recursos 3D em dispositivos móveis para que seu jogo tenha um melhor desempenho e minimize o consumo de energia.

Partes deste artigo são baseadas em trabalhos disponibilizados pela Arm Limited e protegidos por direitos autorais.

Definição de geometria

A geometria, ou malha de polígonos, é uma coleção de vértices, arestas e faces que compõem a forma de um objeto 3D. Pode ser um carro, uma arma, um ambiente, um personagem ou qualquer tipo de recurso visual em um jogo.

Figura 1. Vértices, arestas e triângulos de um cubo.

A geometria é composta pelas seguintes partes:

  • Vértices: o substantivo plural de vértice. Esses pontos definem a estrutura de um objeto no espaço 3D.

  • Arestas: dois vértices conectados com uma linha reta.

  • Triângulo: três vértices conectados entre si por três arestas criam um triângulo. Às vezes, é chamado de polígono ou face. Em softwares 3D, como 3ds Max, Maya ou Blender, geralmente é possível trabalhar com quadrângulos. Quadrângulos são polígonos de quatro lados e são mais fáceis de modificar e usar. Quando renderizados, esses polígonos são exibidos na tela como triângulos.

Saiba mais sobre geometria nas seguintes seções:

Uso de triângulos e polígonos

Esta seção descreve as práticas recomendadas para o uso de triângulos e polígonos. Isso inclui as seguintes recomendações:

Reduzir o número de triângulos

Se você incluir muitos triângulos, o desempenho do jogo será prejudicado.

Use o menor número possível de triângulos. Recomendamos o uso suficiente para garantir a qualidade desejada. Ao criar conteúdo para um jogo para dispositivos móveis, considere o impacto no desempenho. É caro processar vértices. Quanto menos vértices, melhor o desempenho geral do jogo. Além disso, quanto menos triângulos, maior o número de dispositivos sem uma GPU poderosa em que o jogo poderá ser executado.

A imagem a seguir mostra que você pode manter a qualidade com menos triângulos:

O objeto à esquerda tem 584 triângulos, enquanto o objeto à direita tem 704.

Figura 2. Comparação de dois objetos com contagens de triângulos diferentes, que têm a mesma aparência no modo sombreado. No objeto à esquerda, as arestas que não contribuem para a silhueta foram removidas.

Em plataformas móveis, um número máximo comum de vértices para uma malha individual é 65.535. Para garantir a compatibilidade máxima, você precisa ficar abaixo desse número.

O motivo desse limite é que todas as GPUs garantem somente o suporte a índices de 16 bits, o que pode representar um intervalo de 0 a 65.535 vértices. A maioria das GPUs modernas é compatível com índices de 32 bits, que representam um intervalo de 0 a 4.294.967.295 vértices. Se você exceder o intervalo compatível ao usar índices de 16 bits, isso resultará em uma geometria ausente ou renderizada incorretamente.

Sempre veja e teste o jogo nos dispositivos em que pretende lançá-lo, em vez de fazer isso um monitor de PC. Alguns modelos com alto nível de detalhamento podem não ser renderizados corretamente ou nem mesmo ficar visíveis em um dispositivo móvel.

Recomendamos o uso de mais triângulos nos objetos em primeiro plano e menos nos objetos em segundo plano. Isso é mais benéfico para jogos com ponto de vista (POV, na sigla em inglês) estático da câmera. O exemplo a seguir mostra um uso apropriado de detalhes em diferentes objetos.

Os detalhes em objetos em primeiro plano são criados com triângulos. Os detalhes em segundo plano são incorporados em superfícies planas.

Figura 3. Este exemplo mostra o alto nível de detalhamento nos objetos em primeiro plano em comparação com os objetos em segundo plano.

O número máximo de triângulos que você precisa usar em um modelo varia de acordo com o dispositivo e o conteúdo. Se houver mais objetos na tela, use menos triângulos para cada modelo. Se apenas dois ou três objetos forem exibidos, eles poderão incluir mais triângulos.

O exemplo a seguir mostra dois modelos de diferentes demonstrações. A demonstração do Circuit VR tem apenas um personagem robô. Como há apenas um objeto, o modelo do robô tem uma contagem de triângulos maior. O outro modelo é da demonstração da Armies. Essa demonstração tem centenas de soldados em cada frame, de modo que cada soldado tem menos triângulos.

Figura 4. Comparação de contagem de triângulos em dois casos de uso diferentes. À esquerda, o robô CircuitVR tem 11.000 triângulos. À direita, o soldado da Armies tem 360 triângulos.

Exemplo de uso de triângulos

A figura a seguir é um exemplo do número de triângulos usados na demonstração tecnológica da Armies.

Na demonstração da Armies, que é uma demonstração da tecnologia móvel de 64 bits criada no Unity, a câmera é estática com muitos caracteres animados. No total, cada frame renderiza cerca de 210.000 triângulos. Essa contagem de triângulos permite que a demonstração seja executada com estabilidade em cerca de 30 quadros por segundo (QPS).

Figura 5. Exemplo de renderização da demonstração tecnológica da Armies que mostra o número de triângulos usados.

Os maiores objetos da cena, as torres de canhão, têm aproximadamente 3.000 triângulos porque ocupam uma grande parte da tela.

Os caracteres usam cerca de 360 triângulos cada. Como há muitos deles e só são vistos de longe, não usam muitos triângulos. Do POV da câmera, eles parecem adequados.

Figura 6. Visualização dos soldados com poucos triângulos na demonstração tecnológica da Armies.

Usar triângulos em áreas importantes

Os vértices são muito caros em plataformas móveis. Para evitar desperdício do seu orçamento de processamento, coloque vértices em áreas que contribuam para a qualidade visual do jogo. Detalhes pequenos em um objeto 3D podem não ser visíveis na tela final do jogo. Pode ser impossível ver detalhes minúsculos devido ao tamanho reduzido da tela e da posição dos objetos 3D.

Em vez de pequenos detalhes, concentre-se em formas grandes que contribuam para a silhueta. A imagem a seguir é um exemplo de foco na silhueta:

Figura 7. A linha vermelha ao redor do robô representa a silhueta dele.

Recomendamos usar menos triângulos em áreas que não são vistas com muita frequência do POV da câmera. Por exemplo, a parte inferior de um carro ou a parte de trás de um guarda-roupa. Se uma parte de um objeto nunca for vista, exclua-a.

A exclusão de parte de um objeto precisa ser feita com cuidado e pode limitar a reutilização dele. Por exemplo, se você excluir a parte inferior da malha de uma mesa, o usuário verá a seção excluída se a mesa for colocada de cabeça para baixo.

Não modele pequenos detalhes com malhas de triângulo de alta densidade. Use texturas e mapas normais para os detalhes. O exemplo a seguir mostra a mesma malha com e sem um mapa normal.

Figura 8. Comparação de um modelo com e sem um mapa normal aplicado.

Remover microtriângulos

Microtriângulos são triângulos muito pequenos que não contribuem para a aparência final de uma cena.

Todos os objetos 3D com contagem alta de polígonos têm problemas de microtriângulos quando são afastados da câmera. Não há uma definição padrão do setor para microtriângulos, mas geralmente são aqueles com menos de 1 a 10 pixels na imagem final. Os microtriângulos não são uma boa opção porque a GPU precisa processar todos eles, mesmo que não contribuam para a imagem final.

Microtriângulos são causados por dois fatores:

  • Detalhes pequenos demais, compostos por muitos triângulos
  • Objetos afastados da câmera com muitos triângulos

Figura 9. Efeito da distância em microtriângulos.

Na Figura 9, o robô em primeiro plano não tem microtriângulos. O robô em segundo plano tem, porque cada triângulo possui apenas de 1 a 10 pixels.

Figura 10. Comparação de microtriângulos em modelos altamente detalhados. A maioria dos triângulos na área destacada é muito pequena para ser vista nas telas de smartphone.

Para um objeto mais afastado da câmera, use o nível de detalhamento (LOD, na sigla em inglês). Isso reduz a complexidade de um objeto e simplifica o processo. O resultado é um objeto menos denso com triângulos.

Não modele detalhes com muitos triângulos. Use texturas e mapas normais para esse tipo de detalhe. Você pode mesclar os vértices e os detalhes dos triângulos que não contribuem para a imagem final.

É importante reduzir o número de microtriângulos, já que eles podem afetar a largura de banda da memória. Mais triângulos resultam em mais dados enviados para a GPU. Em um dispositivo móvel, isso pode afetar a duração da bateria. O aumento do consumo de energia pode causar limitação térmica, o que restringe o desempenho máximo da GPU.

Evitar triângulos longos e finos

Esses tipos de triângulos são aqueles que, quando renderizados na imagem final, têm menos de 10 pixels em uma dimensão e ocupam boa parte da tela. Em geral, o processamento de triângulos finos é mais dispendioso.

Na imagem a seguir, a faceta no pilar tem um triângulo longo e fino quando visualizada à distância. Essas facetas não são um problema quando vistas de perto.

Figura 11. A faceta no pilar é um triângulo longo e fino.

Recomendamos que você remova triângulos longos e finos de todos os objetos, se possível.

Em objetos brilhantes, triângulos longos e finos podem causar uma oscilação de luz conforme a câmera se move. O LOD pode ajudar a remover triângulos longos e finos quando um objeto estiver afastado da câmera.

Se possível, tente manter todos os triângulos próximos como equiláteros. Com isso, os triângulos terão mais áreas e menos arestas. Em geral, triângulos longos e finos têm desempenho pior em comparação com os maiores. Para mais informações sobre área de triângulo, leia Triangulação.

Nível de detalhamento

O nível de detalhamento (LOD, na sigla em inglês) se refere a uma técnica que reduz a complexidade à medida que os objetos ficam mais distantes do visualizador. A forma mais comum de LOD envolve várias versões de uma malha, com menos vértices progressivamente. O LOD não apenas reduz o número de vértices a serem processados, mas também evita o problema dos microtriângulos. Ele também fica melhor com objetos colocados mais longe na cena.

Recomendamos que você use o LOD sempre que possível. Concentre-se na silhueta do objeto. É melhor se concentrar em áreas planas para conseguir a redução de vértices. A imagem a seguir mostra o uso do LOD, aplicado ao modelo de robô.

À esquerda, está o robô com mais detalhes e o maior número de triângulos. À direita, está o robô mais afastado, que tem menos detalhes e usa menos triângulos.

Figura 12. Comparação do número de vértices usados à medida que o LOD muda.

Na Figura 12, é difícil ver à distância a diferença entre o mesmo objeto que consiste em 200 triângulos ou 2.000 triângulos. Um objeto com mais triângulos acrescenta um alto custo de recursos, mas não melhora a aparência quando visualizado à distância.

Figura 13. Comparação de modelos distantes com diferentes contagens de triângulos.

O LOD como um conceito também pode ser aplicado à complexidade do sombreador e à resolução da textura. Em um LOD mais baixo, materiais diferentes podem ser usados com sombreadores mais simples e menos texturas. Você também precisa garantir que as texturas tenham mipmaps, para que os níveis de textura de resolução mais baixa sejam aplicados a objetos distantes. Essas medidas melhorarão o desempenho, com a desvantagem de aumentar o tamanho dos dados.

Não recomendamos LOD para jogos em que a câmera e os objetos sejam estáticos. O maior benefício do LOD é para objetos que se movem para perto e para longe da câmera. Objetos estáticos não se movem, portanto, não se beneficiam do LOD.

Figura 14. Uma cena de câmera estática da demonstração tecnológica da Armies que não usa LOD.

Proporções de LOD

Use uma proporção consistente ao reduzir o número de triângulos para LOD. Recomendamos que você reduza os triângulos em 50% para cada nível.

Não use o LOD em objetos simples. Objetos que já têm uma baixa contagem de triângulos não se beneficiam do LOD. No exemplo a seguir, uma demonstração tecnológica da The Armies mostra como é o jogo com uma imagem estática e objetos com poucos triângulos.

Figura 15. Comparação entre modelos à medida que o LOD diminui.

Verifique as mudanças nos níveis de LOD nas distâncias adequadas da câmera. Baseie sua análise na forma como eles são usados no jogo.

Figura 16. Comparação da aparência de um modelo LOD 3 de perto e à distância pretendida.

Não há um número fixo para a quantidade de LOD razoável para um objeto. Isso depende do tamanho e da importância do objeto. Por exemplo, um personagem em um jogo de ação ou um carro em um jogo de corrida pode ter mais níveis de LOD do que objetos pequenos em segundo plano, como uma árvore.

Lembre-se de que o LOD utiliza muito os recursos da CPU. Mais capacidade de processamento é necessária para que a CPU decida qual LOD será exibido. Os LODs também usam muita memória, o que aumenta o tamanho do arquivo e o uso de VRAM. Também demora mais para criar e verificar os modelos de LOD.

Há duas maneiras de criar malhas de LOD: manualmente e automaticamente.

  • É possível criar malhas de LOD de forma manual com qualquer software 3D.
    • Para isso, remova os loops das arestas ou reduza o número de vértices no objeto 3D.
    • Isso dá ao artista mais controle sobre o produto final, mas pode demorar mais.
  • É possível criar malhas de LOD automaticamente.
    • Você pode usar um modificador dentro de um pacote 3D, como o ProOptimizer dentro de 3ds Max, ou gerar malhas de LOD dentro do Maya.
    • É possível usar software de geração de LOD, como Simplon ou InstaLOD.
    • Alguns mecanismos de jogos têm um recurso automático de geração de LOD que permite criar e aplicar malhas de LOD.

Práticas recomendadas

Há outras técnicas para reduzir os recursos necessários para seu jogo que também mantêm a fidelidade gráfica.

Grupos de suavização ou vértices normais personalizados

Use grupos de suavização ou vértices normais personalizados para definir a solidez de uma aresta e mudar a aparência de um modelo. Um grupo de suavização ajuda a criar um sombreamento melhor na direção da malha poligonal baixa. Um grupo de suavização também afeta a divisão das ilhas UV e a qualidade dos mapas normais no processo de bake.

Exemplo de um grupo de suavização. À esquerda, há um grupo de suavização aplicado ao robô.

Figura 17. Comparação de um modelo com e sem um grupo de suavização.

Se você implementar um grupo de suavização em um modelo 3D, ele precisará ser exportado do software 3D e importado para o mecanismo.

Topologia de malha

Ao criar um novo recurso 3D, certifique-se de que ele tenha uma topologia organizada. Uma topologia limpa é essencial para personagens e outros objetos que são animados e modificados. A topologia não precisa ser perfeita. Lembre-se de que os usuários finais não verão o espaço delineado e que as texturas e materiais terão um impacto maior na aparência do modelo.

Figura 18. A topologia, o espaço delineado e a versão final de uma pedra da demonstração tecnológica da Armies.

Exagero no formato

É possível exagerar em algumas formas para facilitar a interpretação dos modelos. Isso depende muito do tipo e estilo do seu jogo. Como as telas de dispositivos móveis são reduzidas, pode ser difícil capturar certas formas muito pequenas. O exagero pode ajudar os usuários a ver a forma até mesmo à distância.

Por exemplo, é possível fazer personagens com mãos maiores para facilitar a visualização deles.

Figura 19. Exemplo de modelo que mostra proporções exageradas para melhor visibilidade.