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...
Faixas de visibilidade (HLOD)
Junto com o Nível de detalhe de malha (LOD) e o Descarte por oclusão, os intervalos de visibilidade (visibility ranges) são outra ferramenta para melhorar o desempenho em cenas 3D grandes e complexas.
Nesta página, você aprenderá:
O que os intervalos de visibilidade podem fazer e em quais cenários eles são úteis.
Como configurar intervalos de visibilidade (LOD manual) no Godot.
Como ajustar os intervalos de visibilidade para obter o melhor desempenho e qualidade.
Ver também
Se você só precisa que as malhas se tornem menos detalhadas com a distância, mas não possui malhas de LOD criadas manualmente por um artista, considere confiar no Nível de detalhe de malha (LOD) automático.
Observe que o LOD de malha automático e os intervalos de visibilidade podem ser usados ao mesmo tempo, mesmo na mesma malha.
Como funciona
Os intervalos de visibilidade podem ser usados com qualquer nó que herde de GeometryInstance3D. Isso significa que eles podem ser usados não apenas com MeshInstance3D e MultiMeshInstance3D para HLOD controlado por artistas, mas também com GPUParticles3D, CPUParticles3D, Label3D, Sprite3D, AnimatedSprite3D e CSGShape3D.
Como os intervalos de visibilidade são configurados por nó, isso torna possível usar diferentes tipos de nós como parte de um sistema de LOD. Por exemplo, você poderia exibir uma MeshInstance3D representando uma árvore quando estiver de perto e substituí-la por um impostor Sprite3D à distância para melhorar o desempenho.
O benefício do HLOD em relação a um sistema de LOD tradicional é a sua natureza hierárquica. Uma única malha maior pode substituir várias malhas menores, de modo que o número de chamadas de desenho (draw calls) possa ser reduzido à distância, mantendo as oportunidades de culling quando de perto. Por exemplo, você pode ter um grupo de casas que usa nós MeshInstance3D individuais (um para cada casa) quando de perto, mas se transforma em uma única MeshInstance3D que representa um grupo de casas menos detalhado (ou usar um MultiMeshInstance3D).
Por fim, os intervalos de visibilidade também podem ser usados para desaparecer completamente com certos objetos quando a câmera chegar muito perto ou muito longe. Isso pode ser usado para fins de jogabilidade, mas também para reduzir a poluição visual. Por exemplo, nós Label3D podem ser ocultados gradualmente usando intervalos de visibilidade quando estiverem longe demais para serem legíveis ou relevantes para o jogador.
Configurando a faixa de visibilidade
Este é um guia de início rápido para configurar um sistema de LOD básico. Após seguir este guia, este sistema de LOD exibirá uma SphereMesh quando de perto e uma BoxMesh quando a câmera estiver longe o suficiente. Uma pequena margem de histerese também é configurada por meio das propriedades Begin Margin e End Margin. Isso evita que os LODs fiquem alternando (popping) de um lado para o outro rapidamente quando a câmera estiver se movendo no "limite" da transição de LOD.
As propriedades de intervalo de visibilidade podem ser encontradas na seção Visibility Range do inspetor do GeometryInstance3D após selecionar o nó MeshInstance3D.
Adicione um nó Node3D que será usado para agrupar os dois nós MeshInstance3D.
Adicione um primeiro nó MeshInstance3D como filho do Node3D. Atribua uma nova SphereMesh à sua propriedade Mesh.
Defina o End do intervalo de visibilidade da primeira MeshInstance3D para
10.0e o End Margin para1.0.Adicione um segundo nó MeshInstance3D como filho do Node3D. Atribua uma nova BoxMesh à sua propriedade Mesh.
Defina o Begin do intervalo de visibilidade da segunda MeshInstance3D para
10.0e o Begin Margin para1.0.Afaste e aproxime a câmera do objeto. Note como o objeto fará a transição de uma esfera para uma caixa à medida que a câmera se afasta.
Propriedades da faixa de visibilidade
No inspetor de qualquer nó que herde de GeometryInstance3D, você pode ajustar as seguintes propriedades na seção Visibility Range do GeometryInstance3D:
Begin: O objeto será ocultado quando a câmera estiver mais próxima do centro da AABB do objeto (axis-aligned bounding box) do que este valor (em unidades 3D).
Begin Margin: A distância de transição por histerese ou esmaecimento alfa (alpha fade) a ser usada para a transição de perto (em unidades 3D). O comportamento desta propriedade depende do Fade Mode.
End: O objeto será ocultado quando a câmera estiver mais longe do centro da AABB do objeto do que este valor (em unidades 3D).
End Margin: A distância de transição por histerese ou esmaecimento alfa (alpha fade) a ser usada para a transição de longe (em unidades 3D). O comportamento desta propriedade depende do Fade Mode.
Fade Mode: Controla como a transição entre os níveis de LOD deve ser realizada. Veja abaixo os detalhes.
Fade mode
Nota
O modo de esmaecimento (fade mode) escolhido só tem um impacto visível se o Visibility Range > Begin Margin ou o Visibility Range > End Margin for maior que 0.0.
Na seção Visibility Range do inspetor, existem 3 modos de esmaecimento para escolher:
Disabled: Usa histerese para alternar entre os níveis de LOD instantaneamente. Isso evita situações em que os níveis de LOD ficam alternando rapidamente de um lado para o outro quando o jogador se move para frente e para trás no ponto de transição de LOD. A distância de histerese é determinada por Visibility Range > Begin Margin e Visibility Range > End Margin. Este modo oferece o melhor desempenho, pois não força a renderização a se tornar transparente durante a transição de esmaecimento.
Self: Usa mistura alfa (alpha blending) para esmaecer suavemente entre os níveis de LOD. O nó fará o esmaecimento de si mesmo ao atingir os limites do seu próprio intervalo de visibilidade. A distância da transição de esmaecimento é determinada por Visibility Range > Begin Margin e Visibility Range > End Margin. Este modo força a renderização transparente no objeto durante a sua transição de esmaecimento, portanto possui um impacto no desempenho.
Dependencies: Usa mistura alfa (alpha blending) para esmaecer suavemente entre os níveis de LOD. O nó fará o esmaecimento gradual de suas dependências (fade-in) ao atingir os limites do seu próprio intervalo de visibilidade. A distância da transição de esmaecimento é determinada por Visibility Range > Begin Margin e Visibility Range > End Margin. Este modo força a renderização transparente no objeto durante a sua transição de esmaecimento, portanto possui um impacto no desempenho. Este modo é destinado a sistemas de LOD hierárquicos que utilizam o Visibility parent. Ele age da mesma forma que o Self se os intervalos de visibilidade forem usados para realizar LOD não hierárquico.
Pai de visibilidade
A propriedade Visibility Parent facilita a configuração de HLOD. Ela permite ocultar automaticamente os nós filhos se o seu pai estiver visível, dadas as suas propriedades atuais de intervalo de visibilidade.
Nota
O alvo do Visibility Parent deve herdar de GeometryInstance3D.
Apesar do nome, a propriedade Visibility Parent pode apontar para um nó que não seja um pai do nó na árvore de cena. No entanto, é impossível apontar o Visibility Parent para um nó filho, pois isso cria um ciclo de dependência que não é suportado. Você receberá uma mensagem de erro no painel Output se ocorrer um ciclo de dependência.
Dada a seguinte árvore de cena (onde todos os nós herdam de GeometryInstance3D):
┖╴BatchOfHouses
┠╴House1
┠╴House2
┠╴House3
┖╴House4
Neste exemplo, BatchOfHouses é uma malha grande projetada para representar todos os nós filhos quando vistos à distância. House1 a House4 são MeshInstance3Ds menores que representam casas individuais. Para configurar o HLOD neste exemplo, só precisamos configurar duas coisas:
Set Visibility Range Begin to a number greater than
0.0so that BatchOfHouses only appears when far away enough from the camera. Below this distance, we want House1 to House4 to be displayed instead.Em House1 a House4, atribua a propriedade Visibility Parent para BatchOfHouses.
Isso facilita a realização de ajustes adicionais, já que você não precisa ajustar o Visibility Range Begin de BatchOfHouses e o Visibility Range End de House1 a House4.
O modo de esmaecimento (fade mode) é tratado automaticamente pela propriedade Visibility Parent, de modo que os nós filhos só fiquem ocultos quando o nó pai estiver totalmente visível (faded out). Isso é feito para minimizar o aparecimento repentino (pop-in) visual. Dependendo da sua configuração de HLOD, você pode querer testar os modos de esmaecimento Self e Dependencies fade modes.
Nota
Nós ocultados por meio da propriedade Visible são essencialmente removidos da árvore de dependência de visibilidade, portanto, as instâncias dependentes não levarão em consideração o nó oculto ou os seus ancestrais.
Na prática, isso significa que se o alvo do nó Visibility Parent estiver oculto ao definir sua propriedade Visible como false, o nó não será ocultado de acordo com o valor de Visibility Range Begin especificado no visibility parent.
Dicas de configuração
Use materiais mais simples à distância para melhorar o desempenho
Uma maneira de melhorar ainda mais o desempenho é usar materiais mais simples para malhas de LOD distantes. Embora o uso de malhas de LOD reduza o número de vértices que precisam ser renderizados, a carga de sombreamento por pixel (per-pixel shading) para os materiais permanece idêntica. No entanto, a carga de sombreamento por pixel é frequentemente um gargalo na GPU em cenas 3D complexas. Uma forma de reduzir essa carga de sombreamento na GPU é usar materiais mais simples quando eles não fizerem muita diferença visual.
Os ganhos de desempenho ao fazer isso devem ser medidos com cuidado, pois aumentar o número de materiais únicos em uma cena tem um custo de desempenho por si só. Mesmo assim, usar materiais mais simples para malhas de LOD distantes ainda pode resultar em um ganho de desempenho líquido como resultado de menos cálculos por pixel necessários.
Por exemplo, nos materiais usados por malhas de LOD distantes, você pode desativar recursos caros de material, tais como:
Mapa de Normais (Normal Map - especialmente em plataformas móveis)
Aro
Clearcoat
Anisotrópico
Altura
Dispersão Subsuperficial
Back Lighting
Refração
Proximity Fade
Utilize dithering para transições de LOD
O Godot atualmente suporta apenas o esmaecimento baseado em alfa para intervalos de visibilidade. No entanto, você pode usar pontilhamento (dithering) em vez disso, utilizando vários materiais diferentes para diferentes níveis de LOD.
Existem duas vantagens em usar o pontilhamento em vez da mistura alfa (alpha blending) para transições de LOD:
Maior desempenho, já que a transparência por pontilhamento é mais rápida de renderizar em comparação com a mistura alfa.
Sem falhas visuais devido a problemas de ordenação de transparência durante as transições de LOD.
A desvantagem do pontilhamento é que um padrão "barulhento" (noisy) fica visível durante as transições de esmaecimento do LOD. Isso pode não ser tão perceptível em resoluções de viewport mais altas ou quando o anti-aliasing temporal está ativado.
Além disso, como o distance fade no BaseMaterial3D suporta apenas o esmaecimento de perto ou o esmaecimento quando longe, essa configuração é mais bem utilizada com apenas dois LODs como parte da estrutura.
Certifique-se de que o Begin Margin e o End Margin estejam definidos como
0.0em ambos os nós MeshInstance3D, pois a histerese ou o esmaecimento alfa não são desejados aqui.Em ambos os nós MeshInstance3D, diminua o Begin pela distância de transição de esmaecimento desejada e aumente o End pela mesma distância. Isso é necessário para que a transição por pontilhamento realmente seja visível.
Na MeshInstance3D que é exibida de perto, edite seu material no inspetor. Defina seu modo Distance Fade para Object Dither. Defina o Min Distance para o mesmo valor do End do intervalo de visibilidade. Defina o Max Distance para o mesmo valor menos a distância de transição de esmaecimento.
Na MeshInstance3D que é exibida longe, edite seu material no inspetor. Defina seu modo Distance Fade para Object Dither. Defina o Min Distance para o mesmo valor do Begin do intervalo de visibilidade. Defina o Max Distance para o mesmo valor mais a distância de transição de esmaecimento.