Mitigação de Z-fighting
Quando duas superfícies triangulares se sobrepõem, não fica claro qual delas deve ser renderizada sobre a outra. O resultado ainda varia por pixel, resultando em artefatos dependentes da visualização da câmera. Quando a câmera ou a malha se move, esses padrões se deslocam visivelmente. Esse artefato é chamado Z-fighting. No caso de aplicativos de realidade aumentada e de realidade virtual, o problema é intensificado porque os dispositivos de usar na cabeça naturalmente sempre se movem. Para evitar desconforto do visualizador, o Azure Remote Rendering oferece a funcionalidade de mitigação de conflito z.
Observação
As configurações de mitigação de conflito z não têm efeito na renderização de nuvem de ponto.
Modos de mitigação de Z-fighting
Situação | Resultado |
---|---|
Z-fighting regular | |
Mitigação de Z-fighting habilitada | |
Realce de padrão quadriculado habilitado |
O código a seguir habilita a mitigação do Z-fighting:
void EnableZFightingMitigation(RenderingSession session, bool highlight)
{
ZFightingMitigationSettings settings = session.Connection.ZFightingMitigationSettings;
// enabling z-fighting mitigation
settings.Enabled = true;
// enabling checkerboard highlighting of z-fighting potential
settings.Highlighting = highlight;
}
void EnableZFightingMitigation(ApiHandle<RenderingSession> session, bool highlight)
{
ApiHandle<ZFightingMitigationSettings> settings = session->Connection()->GetZFightingMitigationSettings();
// enabling z-fighting mitigation
settings->SetEnabled(true);
// enabling checkerboard highlighting of z-fighting potential
settings->SetHighlighting(highlight);
}
Observação
A mitigação do Z-fighting é uma configuração global que afeta todas as malhas renderizadas.
Motivos para Z-fighting
O Z-fighting ocorre principalmente por dois motivos:
- Quando as superfícies estão longe da câmera, a precisão dos valores de profundidade diminui e os valores ficam indistintos
- Quando as superfícies em uma malha se sobrepõem fisicamente
O primeiro problema sempre pode acontecer e é difícil de eliminar. Se isso acontecer em seu aplicativo, verifique se a proporção da distância do próximo plano com relação à distância do plano distante é a mais baixa possível. Por exemplo, um plano próximo à distância de 0,01 e um plano distante à distância de 1000 criarão esse problema muito antes do que com o plano próximo à 0,1 e o plano distante à 20 de distância.
O segundo problema é um indicador de conteúdo criado incorretamente. No mundo real, dois objetos não podem estar no mesmo local ao mesmo tempo. Dependendo do aplicativo, os usuários talvez queiram saber se existem superfícies sobrepostas e onde elas estão. Por exemplo, uma cena do CAD de um edifício que é a base para uma construção do mundo real não deve conter interseções de superfície fisicamente impossíveis. Para permitir a inspeção visual, o modo de realce está disponível, que exibe o Z-fighting potencial como um padrão quadriculado animado.
Limitações
A mitigação de Z-fighting apresentada é um melhor esforço. Não há qualquer garantia de que o conflito z será eliminado por completo. Além disso, a mitigação prioriza uma superfície em detrimento da outra. Assim, quando temos superfícies muito próximas entre si, a superfície "errada" pode acabar por cima. Um caso de problema comum é quando o texto e outros decals são aplicados a uma superfície. Com a mitigação do conflito z habilitada, esses detalhes podem simplesmente desaparecer.
Considerações sobre o desempenho
- A habilitação da mitigação das sobreposições de texto gera pouca ou nenhuma sobrecarga de desempenho.
- Além disso, a habilitação da sobreposição do Z-fighting provoca uma sobrecarga de desempenho não trivial, embora possa variar dependendo da cena.
Documentação da API
- RenderingConnection.ZFightingMitigationSettings property em C#
- RenderingConnection::ZFightingMitigationSettings() em C++