Les filtres sous OpenGL sous Linux

 

Le code

Pour faire des essais, vous pouvez reprendre le code du dès

Rappel

Les filtres sont gérés via la fonction glTexParameter()

void glTexParameterf(GLenum target,
GLenum pname,
GLfloat param)

ou

void glTexParameteri(GLenum target,
GLenum pname,
GLint param)

 

GL_TEXTURE_MIN_FILTER et GL_TEXTURE_MAG_FILTER

- GL_NEAREST: prendre le point le plus proche. L'inconvénient, c'est qu'en agrandissant l'image, nous aurons un effet de pixellisation de l'image

Image non trouvée !

- GL_LINEAR: Il s'agit du bilinear filtering : moyenne sur les 2x2 texels les plus proches, à l'inverse de GL_NEAR, si OpenGL à besoin d'agrandir l'image, l'effet qui sera produit est un dégrader entre les texels. La pixellisation va ainsi être estompé.

Image non trouvée !

C'est plus sympa, mais aussi plus gourmand !

 

Pour GL_TEXTURE_MIN_FILTER, il existe encore

GL_NEAREST_MIPMAP_NEAREST

OpenGL va choisir le mipmap correspondant le mieux à la taille désirée, et effectue GL_NEAREST sur la texture.

GL_LINEAR_MIPMAP_NEAREST

OpenGL va choisir le mipmap correspondant le mieux à la taille désirée, et effectue GL_LINEAR sur la texture.

GL_NEAREST_MIPMAP_LINEAR

OpenGL va choisir 2 textures comprises dans la taille de la texture à générer. Il génère alors une texture. Sur la texture générée sera appliquée un GL_NEAREST pour la mettre finalement à la bonne taille.

GL_LINEAR_MIPMAP_LINEAR

OpenGL va choisir 2 textures comprises dans la taille de la texture à générer. Il génère alors une texture. Sur la texture générée sera appliquée un GL_LINEAR pour la mettre finalement à la bonne taille.

Par défaut, pour GL_TEXTURE_MIN_FILTER, c'est la valeur GL_NEAREST_MIPMAP_LINEAR qui est positionnée.

Pour GL_TEXTURE_MAG_FILTER, c'est la valeur GL_LINEAR.

GL_TEXTURE_WRAP_S, GL_TEXTURE_WRAP_T

Méthode d'application des texture en horizontal (GL_TEXTURE_WRAP_S) et vertical (GL_TEXTURE_WRAP_T)

Nous avons vu jusqu'ici que les coordonnées d'un texel étaient comprises entre [0,1]. Mais en fait, que ce passerait-il si on dépasse la valeur 1 dans la fonction glTexCoord()?

Et bien, il y aurait répétition. Essayez par exemple en changeant le code de notre cube sur la face du dessus. Normalement, nous n'affichons qu'un point.

Si vous changez le code:

glTexCoord2i(0,2);glVertex3i( -1, 1, 1);
glTexCoord2i(2,2);glVertex3i( 1, 1, 1);
glTexCoord2i(2,0);glVertex3i( 1, 1, -1);
glTexCoord2i(0,0);glVertex3i( -1, 1, -1);

Nous indiquons alors des coordonnées de texels de 2 en x et en y.

Le résultat est alors le suivant:

Image non trouvée !Affichage de quatre points à la place de notre point tout seul, qui plus est, ils ont diminué en taille (en comparaison avec la face qui affiche les trois points).

Et c'est normal !

En fait, OpenGL et réglé par défaut pour faire une répétition de la texture. Ici, nous doublons la texture en x et en y, d'où les 4 points, mais comme la surface ne change pas en taille, c'est la taille de la texture affichée qui sera diminuée...

GL_REPEAT: C'est le phénomène que nous venons d'expliquer...

GL_CLAMP: Stop la répétition, cependant, si vous indiquez des coordonnées supérieures à 1, il y aura tout de même réduction sur la taille de la texture !

Image non trouvée !Comme il faut bien combler le vide, OpenGL va dupliquer la dernière colonne ou dernière ligne de la texture sur l'espace non rempli par celle-ci.

Par exemple, le point de notre dès est remplacé par ceci:

Image non trouvée ! Le résultat sera alors :Image non trouvée !


GL_CLAMP_TO_EDGE une autre option...

Image non trouvée !Les paramètres quelquechose_ARB sont à oublier (si j'ai bien compris), les nouvelles versions d'OpenGL obligeant et intégrant tout ce qu'il faut pour ne plus en avoir besoin !

 

GL_GENERATE_MIPMAP non essayé..., initialement à GL_FALSE.

 

Annexes

OpenGL pour Linux, Windows, Android...