Por que junções em T nas malhas resultam em rachaduras?
19
Ouvi de várias fontes que ter junções em T em malhas 3D é uma má idéia, pois pode resultar em rachaduras durante a renderização. Alguém pode explicar por que isso acontece e o que se pode fazer para evitá-los?
A resposta do lhf é boa da perspectiva do mosaico, mas isso pode ocorrer com casos de uso mais simples de malha de triângulo.
Veja este exemplo trivial de três triângulos no espaço da tela , ABC, ADE e DBE ...
Embora o ponto E tenha, matematicamente, a intenção de estar exatamente no segmento de linha AB, o pipeline não usará valores totalmente precisos, como números racionais (por exemplo, https://gmplib.org/ ). Em vez disso, provavelmente usará carros alegóricos e, portanto, será introduzida alguma aproximação / erro. O resultado provavelmente será algo como:
Observe que todos os vértices podem ter imprecisões. Embora o exemplo acima mostre uma rachadura, a junção T pode resultar em sobreposição ao longo da borda, fazendo com que os pixels sejam desenhados duas vezes. Isso pode não parecer tão ruim, mas pode causar problemas nas operações de transparência ou estêncil.
Você pode então pensar que, com o ponto flutuante, o erro introduzido será insignificante, mas em um renderizador, os valores do vértice do espaço na tela (X, Y) são quase sempre representados por números de ponto fixo e, portanto, o deslocamento do local ideal geralmente ser muito maior. Além disso, como o hardware de renderização "interpola" o segmento de linha pixel por pixel com sua própria precisão interna, há ainda mais chances de ele divergir da localização arredondada de E.
Se a junção T for "removida", digamos, também dividindo o triângulo ABC em dois, ou seja, AEC e EBC, o problema desaparecerá, pois as mudanças introduzidas pelos erros serão consistentes.
Agora, você pode perguntar por que os renderizadores (especialmente HW) usam matemática de ponto fixo para as coordenadas do vértice XY? Por que eles não usam ponto flutuante para reduzir o problema? Embora alguns o tenham feito (por exemplo, o Dreamcast da Sega), isso pode levar a outro problema, em que a matemática da configuração de triângulo se torna catastroficamente imprecisa, principalmente para triângulos longos e finos, e eles mudam de tamanho de maneiras desagradáveis.
Quando você diz que "os valores dos vértices (X, Y) são quase sempre representados por números de ponto fixo", suponho que você queira dizer as coordenadas dos vértices no espaço da tela no rasterizador, certo? Não são os vértices originais do espaço do modelo.
Nathan Reed
2
@NathanReed Sim. Apenas o espaço na tela X&Y (e, talvez em algumas GPUs Z). Vou editá-lo para deixar isso mais claro.
Simon F
9
Ao modelar superfícies paramétricas com uma malha no domínio do parâmetro, as junções T provavelmente aparecerão como descontinuidades na superfície. Eles aparecerão como lacunas na renderização. Ver abaixo.
Mais geralmente, as junções T nas malhas triangulares provavelmente resultarão em descontinuidades de atributos interpolados, como cores e normais.
A maneira mais simples de evitar isso é garantir que todos os seus vértices sejam soldados
O problema é que você tem cortes nas bordas com um vértice, mas não possui um vértice correspondente na borda adjacente para soldar / conectá-lo; se você pensar nele como um botão em uma camisa, semeou em um botão até a borda, mas não abriu um buraco para que o tecido fique aberto.
Na figura abaixo, os pontos vermelhos representam vértices soldados corretamente, todos os pontos azuis precisam de um vértice adicional para serem cortados na aresta adjacente.
De um modo geral, é uma boa prática manter sua modelagem em quad e tri, isso ajuda a aliviar esse problema, pois você também deve sempre ter um vértice correspondente para soldar. Também ajuda a manter os quadríceps se você planeja usar qualquer método de subdivisão na malha.
Respostas:
A resposta do lhf é boa da perspectiva do mosaico, mas isso pode ocorrer com casos de uso mais simples de malha de triângulo.
Veja este exemplo trivial de três triângulos no espaço da tela , ABC, ADE e DBE ...
Embora o ponto E tenha, matematicamente, a intenção de estar exatamente no segmento de linha AB, o pipeline não usará valores totalmente precisos, como números racionais (por exemplo, https://gmplib.org/ ). Em vez disso, provavelmente usará carros alegóricos e, portanto, será introduzida alguma aproximação / erro. O resultado provavelmente será algo como:
Observe que todos os vértices podem ter imprecisões. Embora o exemplo acima mostre uma rachadura, a junção T pode resultar em sobreposição ao longo da borda, fazendo com que os pixels sejam desenhados duas vezes. Isso pode não parecer tão ruim, mas pode causar problemas nas operações de transparência ou estêncil.
Você pode então pensar que, com o ponto flutuante, o erro introduzido será insignificante, mas em um renderizador, os valores do vértice do espaço na tela (X, Y) são quase sempre representados por números de ponto fixo e, portanto, o deslocamento do local ideal geralmente ser muito maior. Além disso, como o hardware de renderização "interpola" o segmento de linha pixel por pixel com sua própria precisão interna, há ainda mais chances de ele divergir da localização arredondada de E.
Se a junção T for "removida", digamos, também dividindo o triângulo ABC em dois, ou seja, AEC e EBC, o problema desaparecerá, pois as mudanças introduzidas pelos erros serão consistentes.
Agora, você pode perguntar por que os renderizadores (especialmente HW) usam matemática de ponto fixo para as coordenadas do vértice XY? Por que eles não usam ponto flutuante para reduzir o problema? Embora alguns o tenham feito (por exemplo, o Dreamcast da Sega), isso pode levar a outro problema, em que a matemática da configuração de triângulo se torna catastroficamente imprecisa, principalmente para triângulos longos e finos, e eles mudam de tamanho de maneiras desagradáveis.
fonte
Ao modelar superfícies paramétricas com uma malha no domínio do parâmetro, as junções T provavelmente aparecerão como descontinuidades na superfície. Eles aparecerão como lacunas na renderização. Ver abaixo.
Mais geralmente, as junções T nas malhas triangulares provavelmente resultarão em descontinuidades de atributos interpolados, como cores e normais.
fonte
Erro de arredondamento de ponto flutuante.
Depois de transformar a junção T, o ponto no T pode ser arredondado para longe da borda.
Então pode acontecer que um fragmento que é amostrado para um pixel esteja no espaço entre as 2 superfícies.
Isso pode ser corrigido por não haver uma junção em T em primeiro lugar.
fonte
A maneira mais simples de evitar isso é garantir que todos os seus vértices sejam soldados
O problema é que você tem cortes nas bordas com um vértice, mas não possui um vértice correspondente na borda adjacente para soldar / conectá-lo; se você pensar nele como um botão em uma camisa, semeou em um botão até a borda, mas não abriu um buraco para que o tecido fique aberto.
Na figura abaixo, os pontos vermelhos representam vértices soldados corretamente, todos os pontos azuis precisam de um vértice adicional para serem cortados na aresta adjacente.
De um modo geral, é uma boa prática manter sua modelagem em quad e tri, isso ajuda a aliviar esse problema, pois você também deve sempre ter um vértice correspondente para soldar. Também ajuda a manter os quadríceps se você planeja usar qualquer método de subdivisão na malha.
fonte