Limitações da renderização 3D

Ver também

Além das limitações abaixo, as plataformas mobiles têm ainda mais limitações na renderização 3D em comparação com as plataformas de desktop. Veja Limitações de renderização em dispositivos móveis para mais informações.

Introdução

Devido a seu foco no desempenho, os motores de renderização em tempo real têm muitas limitações. O renderizador Godot não é exceção. Para trabalhar eficazmente com essas limitações, você precisa compreendê-las.

Limites de tamanho da textura

Em desktops e laptops, texturas maiores que 8192×8192 podem não ser suportadas em dispositivos mais antigos. Você pode verificar as limitações de sua GPU de destino em GPUinfo.org.

As GPUs mobiles são tipicamente limitadas a 4096×4096 texturas. Além disso, algumas GPUs mobiles não suportam a repetição de texturas sem poder de dois tamanhos. Portanto, se você quiser que sua textura seja exibida corretamente em todas as plataformas, você deve evitar usar texturas maiores que 4096×4096 e usar uma potência de dois tamanhos se a textura precisar repetir.

Faixas de cores

Ao usar os renderizadores GLES3 ou Vulkan, o motor 3D da Godot renderiza internamente em HDR. No entanto, a saída de renderização será tonemaptada para uma faixa dinâmica baixa para que possa ser exibida na tela. Isto pode resultar em bandas visíveis, especialmente quando se utiliza materiais não texturizados. Isto também pode ser visto em projetos 2D quando se usa texturas de gradiente suave.

Existem duas maneiras principais de aliviar as bandas:

  • Habilite Usar o Debanding nas Configurações do Projeto. Isto aplica um shader de debanding de tela cheia como um efeito pós-processamento e é muito barato. O debanding em tela cheia só é suportado quando se usa os renderizadores GLES3 ou Vulkan. Também requer que o HDR seja habilitado nas Configurações do Projeto (que é o padrão).

  • Alternativamente, faça um pouco de ruído em suas texturas. Isto é principalmente eficaz em 2D, por exemplo, para efeitos de vinheta. Em 3D, você também pode usar um debanding shader personalizado para ser aplicado em seus materiais. Esta técnica funciona mesmo se seu projeto for renderizado em LDR, o que significa que funcionará ao renderizar em GLES2.

Ver também

Ver Banding in Games: A Noisy Rant para mais detalhes sobre bandas e formas de combatê-las.

Precisão do buffer de profundidade

Para classificar objetos no espaço 3D, os motores de renderização dependem de um buffer de profundidade * (também chamado *Z-buffer). Este buffer tem uma precisão finita: 24 bits em plataformas desktop, às vezes 16 bits em plataformas móveis (por razões de desempenho). Se dois objetos diferentes terminarem no mesmo valor de buffer, então ocorrerá a luta Z. Isto se materializará em texturas cintilantes para frente e para trás à medida que a câmera se move ou gira.

Para tornar o buffer de profundidade mais preciso sobre a área renderizada, você deve aumentar a propriedade Near do nó da câmera. No entanto, tenha cuidado: se você definir muito alto, os jogadores poderão ver através da geometria próxima. Você também deve diminuir a propriedade Far do nó Câmera para o menor valor permitido para o seu caso de uso, embora tenha em mente que isso não afetará a precisão tanto quanto a propriedade Near.

Se você só precisa de alta precisão quando o jogador pode ver de longe, você pode mudá-lo dinamicamente com base nas condições do jogo. Por exemplo, se o jogador entrar em um avião, a propriedade Perto pode ser temporariamente aumentada para evitar a luta Z na distância. Ela pode então ser diminuída quando o jogador deixa o avião.

Dependendo da cena e das condições de visualização, você também pode ser capaz de mover os objetos na luta em Z mais distantes, sem que a diferença seja visível para o jogador.

Classificação por transparência

No Godot, os materiais transparentes são desenhados após os materiais opacos. Os objetos transparentes são classificados de trás para a frente antes de serem desenhados com base na posição do Spatial, não na posição do vértice no espaço do mundo. Devido a isso, os objetos sobrepostos podem frequentemente ser classificados fora de ordem. Para corrigir objetos classificados incorretamente, ajuste a propriedade Render Priority do material. Isso forçará materiais específicos a aparecer na frente ou atrás de outros materiais transparentes. Mesmo assim, isso pode nem sempre ser suficiente.

Alguns mecanismos de renderização apresentam técnicas de transparência independente da ordem para aliviar isso, mas isso é caro para a GPU. Godot atualmente não fornece esse recurso. Ainda existem várias maneiras de evitar esse problema:

  • Apenas torne os materiais transparentes se você realmente precisar deles. Se um material tiver apenas uma pequena parte transparente, considere dividi-lo em um material separado. Isso permitirá que a parte opaca lance sombras e também pode melhorar o desempenho.

  • Se a sua textura tiver áreas totalmente opacas e totalmente transparentes, você pode usar o teste alfa em vez da mistura alfa. Esse modo de transparência é mais rápido de renderizar e não sofre de problemas de transparência. Ative Parâmetros > Usar Tesoura Alfa em Material Espacial e ajuste Limiar de Tesoura Alfa de acordo, se necessário. Observe que o MSAA não irá suavizar as bordas da textura, mas o FXAA o fará.

  • Se você precisar renderizar áreas semitransparentes da textura, a tesoura alfa não é adequada. Em vez disso, defina a propriedade Parameters > Depth Draw Mode do SpatialMaterial como Opaque Pre-Pass às vezes pode funcionar (a um custo de desempenho).

  • Se você quiser que um material desapareça com a distância, use o modo de atenuação de distância do SpatialMaterial Pixel Dither ou Object Dither em vez de PixelAlpha. Isso tornará o material opaco. Dessa forma, ele também pode projetar sombras.

Anti-serrilhamento de múltiplas amostras

O suavização de serrilhado de várias amostras (MSAA) usa várias amostras de cobertura nas bordas dos polígonos ao renderizar objetos. Ele não aumenta o número de amostras coloridas usadas para renderizar uma cena. Veja o que isso significa na prática:

  • As bordas das malhas serão bem suavizadas (assim como a superamostragem).

  • Os materiais transparentes que usam teste alfa (transparência de 1 bit) não serão suavizados.

  • O aliasing especular ("brilhos" que aparecem em superfícies reflexivas) não será reduzido.

Há várias maneiras de contornar essa limitação, dependendo da margem de uso de desempenho que tenha:

  • Para tornar o aliasing especular menos perceptível, abra as Configurações do Projeto e ative Rendering > Quality > Screen Space Filters > Screen Space Roughness Limiter. Este filtro tem um custo moderado no desempenho. Ele deve ser ativado apenas se você realmente precisar dele.

  • Habilite FXAA além de (ou em vez de) MSAA. Como o FXAA é um método de antialiasing do espaço da tela, ele suavizará qualquer coisa. Como desvantagem, também fará com que a cena pareça mais desfocada, especialmente em resoluções abaixo de 1440p.

  • Renderize a cena em uma resolução mais alta e exiba-a em uma ViewportTexture que corresponda ao tamanho da janela. Certifique-se de habilitar Filter nos sinalizadores ViewportTexture. Essa técnica é chamada de supersampling e é muito lenta. Seu uso geralmente é recomendado apenas para renderização off-line.