Por que usar um filtro de barraca no rastreamento de caminho?


12

As 99 linhas do traçador de caminho C Smallpt renderizam uma grade de subpixel de 2x2 para cada pixel que ele pretende renderizar e, em seguida, cria um filtro de barraca para combiná-los.

Há uma apresentação interessante explicando o código aqui e menciona o filtro de barraca, mas não explica por que está lá.

Alguém pode explicar por que um filtro de barraca seria preferível nesse caso a um desfoque de caixa (apenas calculando a média das amostras)?

Seria de melhor qualidade combinar algo melhor do que um filtro de barraca, como a interpolação bicúbica de hermita?

Respostas:


13

O filtro antialiasing ideal teórico para dados amostrados discretamente é um filtro sinc , porque remove perfeitamente todas as frequências mais altas que a frequência Nyquist, deixando apenas todas as mais baixas. Portanto, até certo ponto, podemos esperar que filtros antialiasing que mais se assemelhem ao filtro sinc produzam imagens de melhor qualidade.

O filtro de barraca (filtro triangular) certamente se parece mais com o pico central do filtro sinc do que o filtro de caixa:

filtros sinc, triângulo e caixa

Um filtro bicúbico (por exemplo, Mitchell-Netravali) poderia capturar a forma do sinc ainda mais precisamente, incluindo seus dois primeiros lobos negativos.

A realidade da seleção de filtro é um pouco mais sutil do que "sinc aproximado, tanto quanto possível", pois existem diferentes tipos de artefatos que podem ser gerados por filtros antialiasing "não ideais", como aliasing, overblurring e ringing. Além disso, filtros diferentes podem ser mais ou menos caros em termos computacionais. Portanto, é um jogo de tentar trocar os diferentes artefatos entre si e contra o desempenho. Diferentes cenas / imagens podem favorecer uma escolha ou outra, e também é parcialmente um julgamento estético.

Quanto ao motivo pelo qual o smallpt usa um filtro de barraca em particular, eu acho que por uma combinação de desempenho (é um filtro rápido para avaliar) e brevidade - isso pode ser feito em algumas linhas de código, enquanto um filtro bicúbico levaria muito mais código.

Aliás, o smallpt realmente usa uma grade de subpixel de 2x2 e coloca um filtro de barraca em cada subpixel e calcula a média dos resultados dos quatro subpixels. Curiosamente, o efeito geral é o da soma de quatro tendas, que acaba parecendo uma pirâmide com um topo plano:

filtros de barraca de subpixel

Não tenho certeza se isso foi intencional ou se foi assim que aconteceu. Meu palpite é que isso resulta em uma imagem um pouco mais nítida do que se um único filtro de barraca por pixel fosse usado (por causa do suporte mais estreito), mas provavelmente também um aliasing mais visível.


Não posso deixar de agradecer! Na prática, entendo isso primeiro como uma amostra estratificada com quatro estratos. E eu personalizo o número de "estratos", como 9, 16 ... Agora, eu sei que é um filtro "trapézio" (não tão comum em outros renderizadores). E como o número dos meus "estratos" tende a ser infinito, o filtro se torna um filtro de caixa, onde eu estou pintando o lírio ... Interessante!
181 chaosink #

3

Acabei de ler os artigos da Wikipedia sobre interpolação bilinear. Um filtro de barraca é um tipo de interpolação bilinear. Uma interpolação bilinear interpola em 2 dimensões. Primeiro interpola linearmente em uma dimensão e depois na outra.

insira a descrição da imagem aqui

Quando você olha para esta figura, ela primeiro faz isso na coluna e depois na linha, por exemplo.

A razão pela qual isso pode ser melhor do que a média de cores é que, quando um dos pontos se aproxima do centro que outro, ele contribui mais para a cor final. Com a média das cores, todos os pontos contribuem da mesma forma, mesmo quando um ponto está mais próximo do centro do que outro.

Se todos os 4 pontos estiverem em posições fixas a uma distância igual do centro, você recebe exatamente 25% de contribuição em todos os pontos, isso é o mesmo que calcular a média.

Isso significa que, quando você implementa o anti-aliasing, processa apenas com uma resolução 4 vezes maior e depois faz uma amostragem reduzida. A saída entre as duas maneiras deve ser a mesma, tanto quanto eu entendo.

Então, qual filtro você deve usar? Bem, depende do que você quer e da sua situação. Se você escolher locais aleatórios de subpixels para suas amostras, talvez seja melhor usar uma interpolação bilinear. Se todos os pontos forem fixos e você renderizar com uma resolução mais alta, a média poderá ser útil. No final, são apenas algumas coisas de sub-pixel que normalmente você nem percebe, por isso, se houver algum tipo de AA, então é bom o suficiente. Mas essa é apenas a minha opinião e provavelmente a do espectador médio de animação 3D ou algo assim.

Uma interpolação bicúbica oferece uma aparência mais suave. Bicubic: insira a descrição da imagem aqui

Bilinear: insira a descrição da imagem aqui

Qual é melhor? Bem, depende do que você gosta, e eu não acho que haverá uma enorme diferença.

Minhas fontes: https://en.wikipedia.org/wiki/Reconstruction_filter#Image_processing

https://en.wikipedia.org/wiki/Bilinear_interpolation

https://en.wikipedia.org/wiki/Bicubic_interpolation

(As imagens são da Wikipedia e são de domínio público)

Espero que ajude, só quero dizer que não sou profissional nisso, sou apenas alguém que gosta de coisas de computação gráfica. Pode ser que eu cometi alguns erros. Se sim, basta dizer e eu mudo!

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.