Aller au contenu principal

Texture

La bibliothèque OpenGL permet de stocker les données des textures dans la mémoire de la carte graphique.

Instanciation

Pour instancier des textures :

void glGenTextures(int n, unsigned int textures);

n étant le nombre de texture à instancier, et textures l'adresse ou stocker les identifiants.

Engagement

Pour définir la texture présentement engagée :

void glBindTexture(int target, unsigned int texture);

texture étant l'identifiant de la texture.

La cible (target) peut être l'une des suivantes :

CibleDescription
GL_TEXTURE_2DTexture en 2 dimensions.
......

Affectation

Pour affecter des données à la texture engagée :

void glTexImage2D(int target, int level, int internalformat, int width, int height, int border, int format, int type, const void* data);

target étant le type de texture, level le niveau (0 pour un type de texture 2D), internalFormat l'ordre des couleur de l'affichage, width et height la dimension de la texture, border pour appliquer une bordure, format l'ordre des couleur de la texture, type la taille qu'occupe chacune des couleurs des pixels de la texture, et data les données de la texture.

Il est à noter que l'affectation réalloue l'espace mémoire de la texture engagée.

Paramétrage

Pour que la bibliothèque OpenGL puisse connaître comment traiter une texture, comment la rapetisser et l'agrandir comme exemple, celle-ci doit être paramétrée :

void glTexParameteri(int target, int pname, int param);

Le nom du paramètre peut être l'un des suivants :

ParamètreDescription
GL_TEXTURE_MIN_FILTERFiltre à utiliser pour rapetisser une texture.
GL_TEXTURE_MAG_FILTERFiltre à utiliser pour agrandir une texture.
......

Filtres

La bibliothèque OpenGL offre plusieurs filtres :

FiltreDescription
GL_NEARESTCouleur du pixel le plus près de la coordonnée de texture.
GL_LINEARInterpolation des couleurs des pixels entourant la coordonnée de texture.
......

Réorganisation

Les pixels nécessitent parfois d'être réorganisés, c'est le cas avec les surfaces de police de caractères provenant de l'extension TTF de la bibliothèque SDL :

void repackSurface(SDL_Surface* sdlSurface) {
unsigned int realPitch = sdlSurface->w * sdlSurface->format->BytesPerPixel;
unsigned char* srcPointer = (unsigned char*)sdlSurface->pixels;
unsigned char* dstPointer = srcPointer;

for (int y; y < sdlSurface->h; y++) {
memmove(dstPointer, srcPointer, realPitch);
dstPointer += realPitch;
srcPointer += sdlSurface->pitch;
}

sdlSurface->pitch = realPitch;
}

La bibliothèque OpenGL offre une fonction pour réaliser cette tâche :

glPixelStorei(GL_UNPACK_ROW_LENGTH, sdlSurface->pitch / 4);

4 étant le nombre d'octets par pixel pour une texture RGBA de 32 bits de profondeur.

Coordonnées

Chaque sommet doit être associé à une coordonnée de texture :

Perspective

Libération

Pour libérer des textures :

void glDeleteTextures(int n, const unsigned int* textures);

n étant le nombre de textures à libérer, et textures l'adresse où les identifiants sont stockés.

Opacité

Le format de couleur comporte une composante « alpha », qui permet d'indiquer l'opacité de la couleur :

glEnable(GL_BLEND);

Calcul

Il y a plusieurs façons de calculer la couleur résultante avec l'opacité source et destination :

CalculDescription
GL_SRC_ALPHAAlpha source.
GL_DST_ALPHAAlpha destination.
GL_ONE_MINUS_SRC_ALPHAUn moins l'alpha source.
GL_ONE_MINUS_DST_ALPHAUn moins l'alpha destination.

Comme exemple, pour utiliser l'alpha pour la source et un moins l'alpha source pour la destination :

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);