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.