Introdução
Muitos dos principais mecanismos de renderização de gráficos vetoriais possuem uma falha algorítmica. Eles renderizam cada forma separadamente e antialias calculando a cobertura de pixels e depois as compõem umas sobre as outras. Sim, é simples, mas as soluções corretas são ainda mais simples.
Isso leva a um problema de conflilação, pois confunde a cobertura pela transparência. A mistura alfa segue uma regra que não representa a situação com precisão, por exemplo, pegue um pixel coberto de 50% que seja vizinho de um pixel que também seja coberto de 50% complementar não termine com 100% de cobertura e termine com 75% de cobertura . A aparência disso depende de como o algoritmo é ajustado e de outros detalhes, mas, em essência, esse é um erro conhecido. Alguém chegou a ter o trabalho de documentar os diferentes erros do mecanismo, além de escrever um artigo mostrando como isso poderia ser feito melhor.
Imagem 1 : Amostra totalmente não representativa, de renderização de uma forma feita de triângulos mostrando erro ampliado na linha superior. Fonte SVG
O problema tem uma solução simples e ingênua * apenas uma super amostra sem cálculo de cobertura e filtra a imagem para baixo. Como bônus, você pode usar algoritmos de reconstrução de imagem melhores do que a filtragem de caixas (leia A Pixel não é um quadrado 3 ). Existem até soluções com velocidade comparável às soluções atuais e essas soluções são muito mais fáceis de serem executadas em pipelines de rasterização de hardware (e você raramente vê esse erro na GPU porque foi criada para evitar esse problema).
Isso também não é um problema sem custo. Há muitas pessoas trabalhando no design gráfico que gastam um tempo não trivial tentando contornar esse problema manualmente, garantindo que haja sobreposição aqui e não sobreposição para corrigir o problema que o computador deve fazer por elas. E falhando espetacularmente em muitos casos. Mas seus clientes não se importam porque o erro existe, eles devem corrigi-lo.
Questão
Como o erro se propaga? Como todos estão cometendo o mesmo erro, pode-se concluir que eles usam a mesma fonte para seu algoritmo. O que poderia ter causado os designers escolherem esse algoritmo? Por que apenas os programadores em 3D reconheceram esse erro e até mesmo codificaram sua parte nas APIs e no ensino, enquanto os programadores em 2D não?
Como garantir que esse erro pare de se propagar mais?
Adendo (mas não estou perguntando sobre isso)
* Aparentemente, minha afirmação de que a super amostragem funciona sem falhas é extraordinária e requer provas extraordinárias. Ok, então a chave para o trabalho de super amostragem é que a super amostragem não faz o processamento da cobertura. Em essência, o super amostrador trata cada amostra como uma amostra pontual. Como a amostra pontual não assume a área subjacente, ela não está causando a comparação alfa onde isso não ocorre.
Para que funcione de forma consistente, conforme descrito em uma das respostas. Precisamos fazer para processar as amostras com amostragem inteira para consistência. Isso garante que cada ponto, uma vez transformado em espaço de tela, obtenha exatamente a mesma solução para coordenadas iguais e que nenhuma amostra seja sombreada por uma borda de pixel 2 vezes. Para fazer isso, uma amostra pode não acionar um pixel ou está exatamente ligado, por exemplo, na parte inferior esquerda (por isso, estabelecemos uma regra de que as arestas exatas são processadas em> vs <=). Todas as placas gráficas, exceto uma, funcionam assim. Ele garante que nenhum dado extra precise ser armazenado em cache e nenhum teste extra nas proximidades precisa ser feito. Esta solução é tão estável, mais geral e consistente que as soluções baseadas em cobertura.
O algoritmo é exatamente o mesmo que o original, com um pouco menos de código e um pouco mais de amostras. É, portanto, tão consistente, se não mais, do que o algoritmo baseado em cobertura. Sabemos disso porque usamos esses métodos há muito tempo em praticamente qualquer outro campo de processamento de sinal, além de placas gráficas.
Então, este método tem uma desvantagem? Bem, é um pouco mais lento se você fizer uma suposição ingênua. Teoricamente, possui um comportamento assintótico mais rápido que o rasterizador de cobertura, parecido com um rastreador de raios, ainda está apenas em pé de igualdade nas cenas típicas. Também poderia tornar mais difícil o uso de efeitos baseados em convolução.