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
- 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é.
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:
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 !
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:
Le résultat sera
alors :
GL_CLAMP_TO_EDGE une autre option...
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.