No traçado de raios / traçado, uma das maneiras mais simples de suavizar o alias da imagem é sobresaminar os valores de pixel e calcular a média dos resultados. IE. em vez de fotografar todas as amostras pelo centro do pixel, você as compara em alguma quantidade.
Ao pesquisar na Internet, encontrei dois métodos um tanto diferentes para fazer isso:
- Gere amostras da maneira que desejar e pese o resultado com um filtro
- Um exemplo é o PBRT
- Gere as amostras com uma distribuição igual à forma de um filtro
- Dois exemplos são smallpt e Benedikt Bitterli 's Tungsten Renderer
Gerar e pesar
O processo básico é:
- Crie amostras da maneira que desejar (sequências aleatórias, estratificadas, de baixa discrepância etc.)
- Desloque o raio da câmera usando duas amostras (x e y)
- Renderize a cena com o raio
- Calcule um peso usando uma função de filtro e a distância da amostra em referência ao centro de pixels. Por exemplo, filtro de caixa, filtro de barraca, filtro gaussiano etc.)
- Aplique o peso à cor da renderização
Gerar na forma de um filtro
A premissa básica é usar a Amostragem de transformação inversa para criar amostras que são distribuídas de acordo com a forma de um filtro. Por exemplo, um histograma de uma amostra distribuída na forma de um gaussiano seria:
Isso pode ser feito exatamente ou dividindo a função em um discreto pdf / cdf. smallpt usa o cdf inverso exato de um filtro de barraca. Exemplos do método de binning podem ser encontrados aqui
Questões
Quais são os prós e os contras de cada método? E por que você usaria um sobre o outro? Eu posso pensar em algumas coisas:
Gerar e pesar parece ser o mais robusto, permitindo qualquer combinação de qualquer método de amostragem com qualquer filtro. No entanto, requer que você rastreie os pesos no ImageBuffer e faça uma resolução final.
A geração na forma de um filtro pode suportar apenas formas positivas de filtro (ou seja, sem Mitchell, Catmull Rom ou Lanczos), pois você não pode ter um pdf negativo. Mas, como mencionado acima, é mais fácil de implementar, pois você não precisa rastrear nenhum peso.
Embora, no final, eu acho que você possa pensar no método 2 como uma simplificação do método 1, já que ele usa essencialmente um peso implícito do filtro de caixa.
fonte
Respostas:
Há um excelente artigo de 2006 sobre esse tópico, Amostragem de importância de filtro . Eles propõem o seu método 2, estudam as propriedades e geralmente são favoráveis a ele. Eles afirmam que esse método fornece resultados de renderização mais suaves porque pesa todas as amostras que contribuem para um pixel igualmente, reduzindo assim a variação nos valores finais do pixel. Isso faz algum sentido, pois é uma máxima geral na interpretação de Monte Carlo que a amostragem por importância fornecerá uma variação menor do que as amostras ponderadas.
O método 2 também tem a vantagem de ser um pouco mais fácil de paralelizar porque os cálculos de cada pixel são independentes de todos os outros pixels, enquanto no método 1, os resultados da amostra são compartilhados entre os pixels vizinhos (e, portanto, precisam ser sincronizados / comunicados de alguma forma quando os pixels são paralelos entre múltiplos processadores). Pelo mesmo motivo, é mais fácil fazer amostragem adaptativa (mais amostras em áreas de alta variação da imagem) com o método 2 do que com o método 1.
No artigo, eles também experimentaram um filtro Mitchell, amostrando a partir de abs () do filtro e depois ponderando cada amostra com +1 ou -1, como sugeriu @trichoplax. Mas isso acabou aumentando a variação e sendo pior que o método 1, então eles concluem que o método 2 é utilizável apenas para filtros positivos.
Dito isto, os resultados deste artigo podem não ser universalmente aplicáveis, e pode ser um pouco dependente da cena qual método de amostragem é melhor. Eu escrevi uma postagem no blog investigando esta questãoindependentemente em 2014, usando uma "função de imagem" sintética em vez de renderização completa, encontrou o método 1 para fornecer resultados visualmente mais agradáveis devido a suavizar as bordas de alto contraste mais bem. Benedikt Bitterli também comentou sobre esse post relatando um problema semelhante com o seu renderizador (excesso de ruído de alta frequência em torno de fontes de luz ao usar o método 2). Além disso, descobri que a principal diferença entre os métodos era a frequência do ruído resultante: o método 2 gera um ruído "com tamanho de pixel" de frequência mais alta, enquanto o método 1 fornece "grãos" de ruído com 2-3 pixels de diâmetro, mas a amplitude do ruído foi semelhante para ambos, portanto, que tipo de ruído parece menos ruim provavelmente é uma questão de preferência pessoal.
fonte