Pourquoi utiliser un filtre de tente dans le traçage de chemin?

12

Les 99 lignes du traceur de chemin C Smallpt rendent une grille de sous-pixels 2x2 pour chaque pixel qu'il a l'intention de rendre, puis fait un filtre de tente pour les combiner.

Il y a une présentation intéressante expliquant le code ici , et il mentionne le filtre de tente mais n'explique pas pourquoi il est là.

Quelqu'un peut-il expliquer pourquoi un filtre de tente serait préférable dans ce cas plutôt qu'un flou de boîte (juste une moyenne des échantillons)?

Serait-il de meilleure qualité d'aller avec quelque chose de mieux qu'un filtre de tente, comme l'interpolation hermite bicubique?

Alan Wolfe
la source

Réponses:

13

Le filtre anti-crénelage idéal théorique pour les données échantillonnées discrètement est un filtre sinc , car il supprime parfaitement toutes les fréquences supérieures à la fréquence de Nyquist, tout en laissant seul toutes les fréquences inférieures. Donc, dans une certaine mesure, nous pouvons nous attendre à des filtres anti-crénelage qui ressemblent plus au filtre sinc pour produire des images de meilleure qualité.

Le filtre de tente (filtre triangle) ressemble certainement plus au pic central du filtre sinc que le filtre carré:

filtres sinc, triangle et box

Un filtre bicubique (par exemple Mitchell-Netravali) pourrait capturer la forme du sinc encore plus précisément, y compris ses deux premiers lobes négatifs.

La réalité de la sélection des filtres est un peu plus subtile que "approximative sinc aussi bien que possible", car il existe différents types d'artefacts qui peuvent être générés par des filtres d'anticrénelage "non idéaux", tels que l'aliasing, le sur-flou et la sonnerie. De plus, différents filtres peuvent être plus ou moins coûteux en calcul. C'est donc un jeu d'essayer d'échanger les différents artefacts les uns contre les autres et contre les performances. Différentes scènes / images peuvent favoriser un choix ou un autre, et c'est aussi en partie un jugement esthétique.

Quant à savoir pourquoi smallpt utilise un filtre de tente en particulier, je suppose que pour une combinaison de performances (c'est un filtre rapide à évaluer) et de brièveté - cela peut être fait en quelques lignes de code, tandis qu'un filtre bicubique prendrait beaucoup plus code.

Soit dit en passant, smallpt utilise en fait une grille de sous-pixels 2x2 et place un filtre de tente à chaque sous - pixel , puis fait la moyenne des résultats des quatre sous-pixels. L'effet global est donc, curieusement, celui de la somme de quatre tentes, qui finit par ressembler à une pyramide à toit plat:

filtres de tente sous-pixel

Je ne sais pas si c'était intentionnel, ou si c'était juste la façon dont cela avait fonctionné. Je suppose que cela donne une image un peu plus nette que si un seul filtre de tente par pixel était utilisé (en raison du support plus étroit), mais probablement aussi un aliasing plus visible.

Nathan Reed
la source
Je ne peux pas m'empêcher de dire merci! En fait, je comprends d'abord cela comme un échantillonnage stratifié avec 4 strates. Et je rend le nombre de "strates" personnalisable, comme 9, 16 ... Maintenant, je sais que c'est un filtre "trapézoïdal" (pas si courant dans les autres rendus). Et comme le nombre de mes "strates" tend à être à l'infini, le filtre devient un filtre box, où je peins le lys ... Intéressant!
chaosink
3

Je viens de regarder des articles Wikipedia sur l'interpolation bilinéaire. Un filtre de tente est une sorte d'interpolation bilinéaire. Une interpolation bilinéaire interpole sur 2 dimensions. Il interpole d'abord linéairement sur une dimension puis sur l'autre.

entrez la description de l'image ici

Lorsque vous regardez cette image, elle le fait d'abord sur la colonne puis sur la ligne par exemple.

La raison pour laquelle cela pourrait être meilleur que la moyenne des couleurs, c'est que lorsque l'un des points se rapproche du centre d'un autre, il contribue davantage à la couleur finale. En faisant la moyenne des couleurs, tous les points contribuent également, même lorsqu'un point est plus proche du centre qu'un autre point.

Si tous les 4 points sont sur des positions fixes à égale distance du centre, alors vous obtenez exactement 25% de contribution sur tous les points, c'est la même chose que la moyenne.

Cela signifie que lorsque vous implémentez l'anticrénelage en effectuant simplement un rendu à une résolution 4 fois supérieure, puis en l'échantillonnant. La sortie entre les 2 voies devrait être la même, si je comprends bien.

Alors, quel filtre utiliser? Eh bien, cela dépend de ce que vous voulez et de votre situation. Si vous choisissez des emplacements de sous-pixels aléatoires pour vos échantillons, il peut être préférable d'utiliser une interpolation bilinéaire. Si tous les points sont fixes et que vous effectuez un rendu à une résolution plus élevée, la moyenne peut être utile. En fin de compte, ce ne sont que des choses sous-pixels que normalement vous ne remarquez pas ou à peine, donc s'il y a une sorte de AA, alors c'est assez bon. Mais c'est juste mon opinion et probablement celle du spectateur moyen de l'animation 3D ou quelque chose comme ça.

Une interpolation bicubique vous donne un aspect plus lisse. Bicubique: entrez la description de l'image ici

Bilinéaire: entrez la description de l'image ici

Ce qui est mieux? Eh bien, cela dépend de ce que vous aimez, et je ne pense pas qu'il y aura une énorme différence.

Mes sources: https://en.wikipedia.org/wiki/Reconstruction_filter#Image_processing

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

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

(Les images proviennent de Wikipédia et sont du domaine public)

J'espère que cela aide, je veux juste dire que je ne suis pas un professionnel, je suis juste quelqu'un qui aime les trucs d'infographie. Il se peut que j'aie fait des erreurs. Si oui, dites-le et je le change!

bram0101
la source