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 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
|
void Renderer::CreateScene()
{
glGenTextures(1, &mTexID);
glBindTexture(GL_TEXTURE_2D, mTexID);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
unsigned char *imageData = LoadMonocolour(); // Fournit une bitmap 64x128 monochrome 8bits par pixel
glTexImage2D(GL_TEXTURE_2D, /*level*/0, GL_ALPHA8, 64, 128, /*border*/0, GL_ALPHA, GL_UNSIGNED_BYTE, imageData);
free(imageData);
}
void Renderer::Draw(const wxSize &ClientSize)
{
glViewport(0, 0, ClientSize.x, ClientSize.y);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glScalef(1.0, (float)ClientSize.x/ClientSize.y, 1.0);
glMatrixMode(GL_MODELVIEW);
glClearColor(0.2f, 0.3f, 0.3f, 1.0f); // vert de gris comme couleur de fond
glClear(GL_COLOR_BUFFER_BIT);
glLoadIdentity();
glBindTexture(GL_TEXTURE_2D, mTexID);
glEnable(GL_TEXTURE_2D);
glEnable(GL_BLEND);
glBlendFunc(GL_ZERO, GL_ONE_MINUS_SRC_ALPHA); //-- "Trouer" le fond avec les zones opaques de la texture
//-- Applique la texture sur une zone rectangulaire
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 1.0f);
glVertex2f(-0.5f, -1.0f);
glTexCoord2f(1.0f, 1.0f);
glVertex2f( 0.5f, -1.0f);
glTexCoord2f(1.0f, 0.0f);
glVertex2f( 0.5f, 1.0f);
glTexCoord2f(0.0f, 0.0f);
glVertex2f(-0.5f, 1.0f);
glEnd();
glDisable(GL_TEXTURE_2D); //-- Désactiver la texture pour utiliser la couleur
glEnable(GL_BLEND);
glBlendFunc(GL_ONE_MINUS_DST_ALPHA, GL_ONE); //-- Utilise la transparence du buffer pour ne peindre que dans les "trous"
glColor3f(1.0f, 0.0f, 1.0f); //-- Couleur à faire apparaître dans les "trous" du fond
//-- Applique la couleur sur la même zone rectangulaire
//-- Sans aucun effet car manifestement la fonction GL_ONE_MINUS_DST_ALPHA retourne toujours 0
//-- Note: J'ai utilisé d'autre valeurs que GL_ONE_MINUS_DST_ALPHA qui corroborent l'hypothèse.
glBegin(GL_QUADS);
glVertex2f(-0.5f, -1.0f);
glVertex2f( 0.5f, -1.0f);
glVertex2f( 0.5f, 1.0f);
glVertex2f(-0.5f, 1.0f);
glEnd();
glFlush();
} |
Partager