Bonjour à tous et à toutes.
Je me suis mis à faire une petite bibliothèque de dessin 2d de sprites et de primitives en utilisant OpenGl 1.x.
J'utilise comme langage le C# et une vieille bibliothèque nommée TAO qui me fait un mapping 1-1 avec l'OpenGl classique (ce qui est mon but).
J'ai réussit (mais c'est simple) à faire des tracés de rectangles (pleins ou vides), de cercles, de lignes, de points.
Je me suis penché sur la problématique d'affichage de sprite 2d (purement).
J'utilise la séquence d'initialisation suivante :
Elle utilise un fichier de mon cru qui contient les infos qu'il me faut pour charger une texture (qui est une classe aussi de mon cru) en plus des initialisations pour un affichage 2d 640 par 480.
J'utilise la fonction suivante pour afficher un sprite :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 public static bool InitGL() { Gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f); Gl.glGenTextures(1, _textureIds); _currentTexture = LoadTexture("A.pof"); // Chargement de mon fichier perso // dans ma classe Texture perso Gl.glEnable(Gl.GL_TEXTURE_2D); Gl.glEnable(Gl.GL_ALPHA_TEST); Gl.glAlphaFunc(Gl.GL_GREATER, 0); Gl.glDisable(Gl.GL_DEPTH_TEST); Gl.glDisable(Gl.GL_LIGHTING); Gl.glDisable(Gl.GL_DITHER); Gl.glMatrixMode(Gl.GL_PROJECTION); Gl.glLoadIdentity(); Gl.glOrtho(0, 640, 480, 0, 0, 1); Gl.glMatrixMode(Gl.GL_MODELVIEW); Gl.glTexEnvi(Gl.GL_TEXTURE_ENV, Gl.GL_TEXTURE_ENV_MODE, Gl.GL_REPLACE); return true; }
Je passe une référence à ma classe Texture qui en fait contient l'identifiant OpenGl de la texture, une structure Point pour l'emplacement d'affichage et enfin un byte qui est censé donner l'alpha d'affichage : 0 (sprite invisible) ---- 128 (translucide) --- 255 (silde) etc..
Voici ma classe perso texture
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 public static void DrawTexture(Texture texture, Point point, byte alpha) { Gl.glBindTexture(Gl.GL_TEXTURE_2D, texture.GetIndex()); Gl.glBegin(Gl.GL_QUADS); Gl.glTexCoord2d(0, 0); Gl.glVertex2f(point.X, point.Y); Gl.glTexCoord2d(1, 0); Gl.glVertex2f(point.X + texture.GetWidth(), point.Y); Gl.glTexCoord2d(1, 1); Gl.glVertex2f(point.X + texture.GetWidth(), point.Y + texture.GetHeight()); Gl.glTexCoord2d(0, 1); Gl.glVertex2f(point.X, point.Y + texture.GetHeight()); Gl.glEnd(); }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37 public sealed class Texture { private Color _alphaColor; private int _width; private int _height; private int _index; public Color GetAlphaColor() { return _alphaColor; } public int GetWidth() { return _width; } public int GetHeight() { return _height; } public int GetIndex() { return _index; } public Texture(int width, int height, int index, ref Color alphaColor) { _alphaColor = alphaColor; _width = width; _height = height; _index = index; } }
Mon problème est le suivant :
Dans ma petite bibliothèque, je voudrais afficher des sprites qui ont des parties invisible et avec un degré de transparence. Par exemple, imaginons une piece de monnaie dans une image carré dont le fond serait en rouge.
Il faudrait que le fond rouge ne s'affiche pas et que la piece de monnaie puisse s'afficher avec des degré de transparence paramétré.
Jusqu'ici, j'ai réussit à rendre le fond de mon image invisible grace à
Gl.glEnable(Gl.GL_ALPHA_TEST);
Gl.glAlphaFunc(Gl.GL_GREATER, 0);
et
Gl.glTexEnvi(Gl.GL_TEXTURE_ENV, Gl.GL_TEXTURE_ENV_MODE, Gl.GL_REPLACE);
mais je ne vois pas comment faire pour faire varier la transparence avec mon paramètre alpha dans ma fonction
public static void DrawTexture(Texture texture, Point point, byte alpha)
J'ai tournée en rond et je vous demande humblement votre aide .....
Marci à tous !
Partager