Est-il logique d'utiliser son propre algorithme de création mipmap pour les textures OpenGL?

je me demandais si la qualité de la texture mipmaps serait meilleure si j'utilisais mon propre algorithme pour les pré-générer, au lieu de l'automatique intégré. J'utiliserais sûrement un algorithme lent, mais joli, comme Lanczos qui rééchantillonne.

T-il un sens? Vais-je obtenir de l' gain de qualité sur les cartes graphiques modernes?

15
demandé sur GhassanPL 2009-05-07 01:34:45

4 réponses

il y a de bonnes raisons de générer vos propres mipmaps. Cependant, la qualité du downsampling n'en fait pas partie.

les programmeurs de jeux et de graphiques ont expérimenté toutes sortes d'algorithmes de downsampling dans le passé. En fin de compte, il s'est avéré que la méthode très simple "moyenne de quatre pixels"donne les meilleurs résultats. Aussi des méthodes plus avancées sont en théorie mathématique plus correct, ils ont tendance à prendre beaucoup de netteté de la mipmaps. Cela donne un aspect plat (essayer c'!).

cependant, vous pouvez vouloir calculer vos mipmaps avec la correction gamma. OpenGL ne fait pas cela tout seul. Cela peut faire une réelle différence visuelle, en particulier pour les textures plus foncées.

le Faire est simple. Au lieu de faire la moyenne de quatre valeurs ensemble comme ceci:

float average (float a, float b, float c, float d)
{
  return (a+b+c+d)/4
}

le Faire ceci:

float GammaCorrectedAverage (float a, float b, float c, float d)
{
  // assume a gamma of 2.0 In this case we can just square
  // the components. 
  return sqrt ((a*a+b*b+c*c+d*d)/4)
}

ce code suppose que vos composants de couleur sont normalisés pour être dans la gamme de 0 à 1.

10
répondu Nils Pipenbrinck 2009-05-06 23:45:05

Qu'est-ce qui vous motive à essayer? Les cartes à puce que vous avez actuellement sont-elles mal générées? (c'est à dire avez-vous regardé?) Gardez à l'esprit que vos résultats seront souvent encore (tri)interpolés linéairement de toute façon, de sorte qu'entre ce que le mouvement il y a souvent des retours décroissants abrupts à un rééchantillonnage amélioré.

2
répondu simon 2009-05-06 21:45:58

cela dépend du type d'actifs que vous affichez. Lanczos filter se rapproche du filtre passe-bas idéal et les résultats sont visibles si vous comparez les cartes mip côte à côte. La plupart des gens confondront l'Alias pour la netteté - encore une fois cela dépend si vos actifs ont tendance à contenir des fréquences élevées - j'ai certainement vu des cas où le filtre de boîte n'était pas une bonne option. Mais puisque la carte de mip est alors interpolée linéairement de toute façon le gain pourrait ne pas être aussi perceptible. Il y a autre chose à mention-la plupart des gens utilisent le filtre de boîte et passer la sortie comme une entrée dans la prochaine étape - de cette façon, vous perdez à la fois la précision et l'énergie visuelle (bien que gamma aidera celui-ci). Si vous pouvez trouver du code qui utilise un filtre arbitraire (notez que la plupart d'entre eux sont séparables en deux passes), vous escaladerez typiquement le noyau du filtre lui-même et produirez des niveaux de carte mip à partir de la texture de base, ce qui est une bonne chose.

2
répondu baze 2011-07-16 12:33:47

en plus de cette question, j'ai découvert que certains algorithmes de mipmapping complètement différents (plutôt que ceux qui essayent simplement d'obtenir la meilleure qualité de mise à l'échelle, comme le filtrage Lanczos) ont de bons effets sur certaines textures.

par exemple, sur certaines textures qui sont supposées représenter des informations de haute fréquence, j'ai essayé d'utiliser un algorithme qui prend simplement un pixel aléatoire des quatre qui sont considérés pour chaque itération. Les résultats dépendent beaucoup sur la texture et ce qu'elle est censée véhiculer, mais j'ai trouvé qu'elle donne un grand effet sur certains; pas moins pour les textures de sol.

un autre que j'ai essayé est de prendre le plus déviant des quatre pixels pour préserver les contrastes. Il a encore moins d'usages, mais ils existent.

en tant que tel, j'ai implémenté l'option de choisir l'algorithme mipmapping par texture.

EDIT: j'ai pensé que je pourrais donner quelques exemples des différences dans la pratique. Voici un morceau de texture d'herbe sur le sol, l'image la plus à gauche étant avec moyenne mipmapping standard, et la plus à droite étant avec mipmapping aléatoire:

Average mipmapping, trilinear filtering Random mipmapping, trilinear filtering

j'espère que le spectateur peut apprécier combien "détail apparent" est perdu dans la moyenne mipmap, et combien plus plat il regarde pour ce genre de texture.

pour référence, voici les mêmes échantillons avec 4× anisotrope filtrage activé (ce qui précède étant tri-linéaire):

Average mipmapping, 4× anisotropic filtering Random mipmapping, 4× anisotropic filtering

le filtrage anisotrope rend la différence moins prononcée, mais elle est toujours là.

1
répondu Dolda2000 2017-05-23 14:43:05