Attention: Here be dragons
This is the latest
(unstable) version of this documentation, which may document features
not available in or compatible with released stable versions of Godot.
Checking the stable version of the documentation...
Nível de detalhe de malha (LOD)
O nível de detalhe (LOD - Level of Detail) é uma das formas mais importantes de otimizar o desempenho de renderização em um projeto 3D, junto com o Descarte por oclusão.
Nesta página, você aprenderá:
Como o LOD de malha pode melhorar o desempenho de renderização do seu projeto 3D.
Como configurar o LOD de malha no Godot.
Como medir a eficácia do LOD de malha no seu projeto (e alternativas que você pode explorar caso ele não atenda às suas expectativas).
Ver também
Você pode ver o funcionamento de LOD de malha utilizando o projeto de demonstração Occlusion Culling and Mesh LOD demo project.
Introdução
Historicamente, o nível de detalhe em jogos 3D envolvia a criação manual de malhas com menor densidade geométrica, seguida da configuração dos limites de distância nos quais essas malhas menos detalhadas deveriam ser desenhadas. Essa abordagem ainda é usada hoje quando um controle maior é necessário.
No entanto, em projetos que possuem uma grande quantidade de recursos 3D detalhados, configurar o LOD manualmente pode ser um processo muito demorado. Como resultado, a dizimação automática de malhas e a configuração de LOD estão se tornando cada vez mais populares.
O Godot oferece uma maneira de gerar automaticamente malhas menos detalhadas para o uso de LOD no momento da importação e, em seguida, usar essas malhas de LOD automaticamente quando necessário. Isso é completamente transparente para o usuário. A biblioteca meshoptimizer é utilizada nos bastidores para a geração das malhas de LOD.
O LOD de malha funciona com qualquer nó que desenhe malhas 3D. Isso inclui MeshInstance3D, MultiMeshInstance3D, GPUParticles3D e CPUParticles3D.
Comparação visual
Aqui está um exemplo de malhas de LOD geradas na importação. Malhas com menor nível de detalhe serão usadas quando a câmera estiver longe do objeto:
Do mais detalhado (esquerda) ao menos detalhado (direita), visão sombreada (shaded)
Aqui está a mesma imagem com a renderização em aramado (wireframe) para tornar a dizimação mais fácil de ver:
Do mais detalhado (esquerda) ao menos detalhado (direita), visão em aramado (wireframe)
Ver também
Se você precisar configurar manualmente o nível de detalhe com malhas criadas por artistas, use Faixas de visibilidade (HLOD) em vez do LOD de malha automático.
Gerando LOD de malha
Por padrão, a geração de LOD de malha ocorre automaticamente para cenas 3D importadas (glTF, .blend, Collada, FBX). Uma vez geradas as malhas de LOD, elas serão usadas automaticamente ao renderizar a cena. Você não precisa configurar nada manualmente.
No entanto, a geração de LOD de malha não acontece automaticamente para malhas 3D importadas em formato OBJ. Isso ocorre porque arquivos OBJ não são importados como cenas 3D completas por padrão, mas apenas como recursos de malha individuais para serem carregados em um nó MeshInstance3D (ou GPUParticles3D, CPUParticles3D, ...).
Para fazer com que um arquivo OBJ tenha o LOD de malha gerado, selecione-o na aba FileSystem, vá até a aba Import, mude sua opção Import As para Scene e clique em Reimport:
Alterando o tipo de importação em um arquivo OBJ na aba Import
Isso exigirá reiniciar o editor após clicar em Reimport.
Nota
O processo de geração de LOD de malha não é perfeito e pode, ocasionalmente, introduzir problemas de renderização (especialmente em malhas com esqueleto/skinned meshes). A geração de LOD de malha também pode demorar um pouco em malhas complexas.
Se o LOD de malha fizer com que uma malha específica pareça quebrada, você pode desativar a geração de LOD para ela na aba Import. Isso também acelerará a importação de recursos. Isso pode ser feito globalmente nas opções de importação da cena 3D, ou para cada malha individualmente usando a janela de Configurações Avançadas de Importação.
Consulte Importing 3D scenes para mais informações.
Comparando o visual e o desempenho do LOD de malha
Para desativar o LOD de malha no editor para fins de comparação, use o modo avançado de desenho de depuração Disable Mesh LOD. Isso pode ser feito usando o menu no canto superior esquerdo da viewport 3D (rotulado como Perspective ou Orthogonal, dependendo do modo da câmera):
Desativando o LOD de malha no menu superior esquerdo da viewport 3D
Ative View Frame Time no mesmo menu para visualizar o FPS no canto superior direito. Ative também View Information no mesmo menu para visualizar o número de primitivas (vértices + índices) renderizadas no canto inferior direito.
Se o LOD de malha estiver funcionando corretamente na sua cena e a sua câmera estiver longe o suficiente da malha, você deverá notar o número de primitivas desenhadas diminuindo e o FPS aumentando quando o LOD de malha é deixado ativado (a menos que você esteja limitado pela CPU).
Para ver a dizimação do LOD de malha em ação, mude o modo de desenho de depuração para Display Wireframe no menu especificado acima e, em seguida, ajuste a configuração de projeto Rendering > Mesh LOD > LOD Change > Threshold Pixels.
Configurando o desempenho e a qualidade do LOD de malha
Você pode ajustar o quão agressivas devem ser as transições de LOD de malha na viewport raiz alterando a configuração de projeto Rendering > Mesh LOD > LOD Change > Threshold Pixels. Para alterar este valor em tempo de execução, configure a propriedade mesh_lod_threshold na viewport raiz da seguinte forma:
get_tree().root.mesh_lod_threshold = 4.0
GetTree().Root.MeshLodThreshold = 4.0f;
Cada viewport tem sua própria propriedade mesh_lod_threshold, que pode ser definida independentemente de outras viewports.
O limite padrão de LOD de malha de 1 pixel é ajustado para parecer perceptualmente sem perdas (lossless); ele fornece um ganho de desempenho significativo com uma perda de qualidade imperceptível. Valores mais altos farão com que as transições de LOD aconteçam mais cedo quando a câmera se afastar, resultando em maior desempenho, mas menor qualidade.
Se você precisar realizar ajustes por objeto no LOD de malha, poderá ajustar o quão agressivas devem ser as transições de LOD modificando a propriedade LOD Bias em qualquer nó que herde de GeometryInstance3D. Valores acima de 1.0 farão com que as transições de LOD aconteçam mais tarde do que o normal (resultando em maior qualidade, mas menor desempenho). Valores abaixo de 1.0 farão com que as transições de LOD aconteçam mais cedo do que o normal (resultando em menor qualidade, mas maior desempenho).
Adicionalmente, os nós ReflectionProbe possuem sua própria propriedade Mesh LOD Threshold que pode ser ajustada para melhorar o desempenho de renderização quando o reflection probe é atualizado. Isso é especialmente importante para ReflectionProbes que usam o modo de atualização Always.
Nota
Ao renderizar a cena, a seleção de LOD de malha usa uma métrica de espaço de tela (screen-space). Isso significa que ela leva automaticamente em consideração o campo de visão (FOV) da câmera e a resolução da viewport. Um FOV de câmera mais alto e resoluções de viewport mais baixas tornarão a seleção de LOD mais agressiva; o motor exibirá modelos fortemente dizimados mais cedo quando a câmera se afastar.
Como resultado, ao contrário de Faixas de visibilidade (HLOD), você não precisa fazer nada específico no seu projeto para levar em consideração o FOV da câmera e a resolução da viewport.
Usando LOD de malha com MultiMesh e partículas
Para a seleção de LOD, o ponto da AABB do nó que estiver mais próximo da câmera é usado como base. Isso se aplica a qualquer tipo de LOD de malha (incluindo para MeshInstance3D individuais), mas traz algumas implicações para nós que exibem várias malhas de uma vez, como MultiMeshInstance3D, CPUParticles3D e GPUParticles3D. Mais importante ainda, isso significa que todas as instâncias serão desenhadas com o mesmo nível de LOD em um determinado momento.
Se você estiver notando uma seleção incorreta de LOD com GPUParticles3D, certifique-se de que a AABB de visibilidade do nó esteja configurada selecionando o nó GPUParticles3D e usando GPUParticles3D > Generate AABB no topo da viewport 3D.
Se você tiver instâncias em um MultiMesh que estão longe umas das outras, elas devem ser colocadas em um nó MultiMeshInstance3D separado. Fazer isso também melhorará o desempenho de renderização, pois o culling por frustum e por oclusão poderá descartar nós individuais (enquanto eles não conseguem descartar instâncias individuais em um MultiMesh).