Comment calculer avec précision la couverture des courbes analytiques qui se chevauchent?

10

L'anticrénelage des formes 2D se résume à calculer la fraction d'un pixel qui est couverte par la forme. Pour les formes simples qui ne se chevauchent pas, ce n'est pas trop difficile: clipez la forme contre le rectangle de pixels et calculez la zone de la forme résultante. Mais cela devient plus difficile si plusieurs formes chevauchent le même pixel. La simple addition de zones peut entraîner une couverture calculée trop élevée si elle néglige la quantité qu'une forme recouvre une autre forme. Par exemple, consultez la section Limitations de cet article sur le rendu des polices . Vous pourriez également être dans une situation où les deux courbes proviennent d'objets différents avec des couleurs différentes (il ne s'agit donc pas de la couverture totale pour l'union des deux formes, mais de la couverture de chacune séparément).

Comment cela serait-il calculé si vous vous souciez de l'exactitude complète? Encore plus délicat, comment calculer la couverture avec précision pour les formes non polygonales superposées comme les courbes? Y a-t-il un moment où vous n'avez pas d'autre choix que de vous rabattre sur des techniques de multi-échantillonnage ou stochastiques?

John Calsbeek
la source

Réponses:

10

Il n'y a vraiment aucun bon moyen de le faire de manière analytique efficace pour tous les cas d'angle. La plupart ou tous les moteurs de rendu 2D commerciaux qui tentent de faire un calcul de couverture analytique font des erreurs prévisibles que les méthodes de multi-échantillonnage ne font pas.

Un problème typique est deux formes qui se chevauchent et partagent le même bord. La situation courante est que les canaux alpha se résument à un bord alpha trop épais qui aliase légèrement. Ou si les formes sont de couleurs différentes, le système confond la couleur de l'arrière-plan. C'est extrêmement ennuyeux.

image

Image 1 : Le moteur de rendu confond la couverture et crée un mince contour blanc là où aucun contour ne devrait être.

La deuxième couverture parfaite revient au filtrage de boîtes. Nous pouvons certainement faire mieux. Étant donné qu'il y a tellement de cas d'angle spéciaux qui nécessiteraient des opérations booléennes sur les formes pour bien faire, le super échantillonnage est toujours supérieur. En fait, les estimations de couverture peuvent être utilisées pour concentrer l'échantillonnage là où il est le plus probable.

La situation pourrait être simplifiée en polygones à des niveaux inférieurs aux pixels, puis la solution analytique discrète pourrait être résolue. Mais cela au détriment de la flexibilité. Par exemple, il n'est pas hors de question que les futurs systèmes vectoriels puissent vouloir permettre des lignes floues de largeur variable qui posent un problème pour les solutions analytiques, comme le font d'autres objets de couleurs variables.

Comment le faire analytiquement

Scène analytique

Image 2 : Supposons que vous ayez cette scène, vue éclatée à droite

Maintenant, vous ne pouvez pas simplement faire cela analytiquement, chaque pièce séparément, puis fusionner les données. Parce qu'il en résulte des données erronées. Voir le mélange alpha laisserait le bleu briller à travers les lacunes si vous le faisiez.

Vous devez donc diviser la scène afin que chaque forme élimine ce qui est sous l'autre:

entrez la description de l'image ici

Image 3 : Vous devez couper les surfaces sous-jacentes.

Maintenant, si tout est opaque, tout est simple. il suffit de calculer l'aire de chaque pièce et de la multiplier par la couleur et de les additionner. Maintenant, vous pouvez utiliser quelque chose comme ça .

Tout cela se décompose si vos formes individuelles ne sont pas opaques bien sûr, mais même cela peut être fait à un certain niveau.

Rappelles toi:

  • Le calcul AA doit être effectué dans un espace colorimétrique linéaire et reconverti pour utiliser l'espace.
joojaa
la source
Disons que nous ne nous soucions pas beaucoup de l'efficacité. Comment procéder pour calculer la couverture des opérations booléennes sur les formes? Est-ce possible en général ou uniquement pour des formes spécifiques?
John Calsbeek
@JohnCalsbeek ok je commence à construire la réponse analytique,
ça