Autore Topic: [C++][OpenGL] Texture trasparenti  (Letto 1719 volte)

Offline Z80Fan

  • Administrator
  • Guru
  • *****
  • Post: 1671
  • Karma: +13/-2
    • Mostra profilo
    • http://z80fan.altervista.org
[C++][OpenGL] Texture trasparenti
« il: 12 Novembre 2011, 23:46:06 »
In un gioco che sto programmando, sto scrivendo il codice per disegnare del testo sullo schermo.
Ho un .png con i 256 simboli, sono bianchi e tutto il resto è trasparente.
Nel gioco, ogni carattere è un GL_QUADS uv-mappato sul giusto carattere nella texture.
Il problema che ho è che lo sfondo viene renderizzato nero.
Ho provato diversi metodi, e quello che sembra più plausibile non funziona:

Codice: [Seleziona]
//Salva attributi e matrice
glPushMatrix();
glPushAttrib(GL_TEXTURE_BIT | GL_CURRENT_BIT | GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

/*
However, if you want blending to occur when the primitive is texture mapped
(i.e., you want parts of the texture map to allow the underlying color of the primitive to show through),
then don't use OpenGL blending.
Instead, you'd use glTexEnv(), and set the texture environment mode to GL_BLEND.
In this case, you'd want to leave the texture environment color to its default value of (0,0,0,0).
*/

glBindTexture(GL_TEXTURE_2D, tex.id); // bindo la texture

glDisable(GL_BLEND); // I documenti dicono di disattivare il blending
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL); // decal sembra la modalità che fa per me

// Crea i quads e mappa sulla texture
...

// Ripristina gli attributi e la matrice
glPopAttrib();
glPopMatrix();
I documenti che ho consultato sono questo e questo.
Sembra che il GL_DECAL sia quello che fa per me, con la formula Cv = Cp(1 - As) + CsAs.

Questo è il codice che uso per generare le texture:
Codice: [Seleziona]
glGenTextures(1, &text.id);

// Seleziono la texture su cui voglio lavorare
glBindTexture(GL_TEXTURE_2D, text.id);

// Imposto come deve essere scalata l'immagine, rispettivamente se è più grande della texture, o più piccola
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); // cheap scaling when image bigger than texture
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); // cheap scaling when image smalled than texture

// 2d texture, level of detail 0 (normal), internal format (GL_RGBA), x size from image, y size from image,
// border 0 (normal), rgb color data, unsigned byte data, and finally the data itself.
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, img.getSizeX(), img.getSizeY(), 0, GL_RGBA, GL_UNSIGNED_BYTE, img.getData());

Idee? Sbaglio la creazione delle texture, o GL_DECAL non è proprio quello che cerco? Dimentico di impostare qualche flag?
« Ultima modifica: 01 Gennaio 1970, 02:00:00 da Guest »

Offline raistlin77it

  • Tech Guru
  • *****
  • Post: 221
  • Karma: +2/-0
    • Mostra profilo
Re: [C++][OpenGL] Texture trasparenti
« Risposta #1 il: 13 Novembre 2011, 02:22:42 »
devi colorare i quads quando li disegni, per quello che sono neri  :) (non hai messo il colore )

prova a mettere  glColor3ub ( 255,255,255);  e vedrai che leggi le scritte :D

Anzi io i decal te li sconsiglierei, se metti ad esempio una funzione di blend classica tipo :

glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

e abiliti il blend delle testures con

glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);


non devi stare a cambiare modo di visualizzazione delle textures nel caso usassi anche textures semi trasparenti (in questo caso però i font devono avere l'aplha channel )



ad esempio in questo programma, col metodo che ti ho consigliato, posso usare un immagine col 50% di trasparenza (il titolo) ed i fonts senza cambiare modalità di visualizzazione delle textures.
in parole povere metti una sola volta

glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);

e sei apposto.


Col tuo metodo invece devi :

abilitare il blend e mettere la funzione di blending
disegni il titolo (o qualsiasi texture semitrasparente )
togli il blend
metti i decal
scrivi con i fonts


/spiegazione "spannometrica" ON
I decal sono degli "stickers o figurine" che appiccichi su poligoni colorati per i quali hai bisogno di vedere sia il colore dell'oggetto, che ovviamente la "figurina" incollata sopra.  
Pensa ad esempio ad una macchina con incollata sulla portiera una pubblicità
/spiegazione "spannometrica" OFF
« Ultima modifica: 01 Gennaio 1970, 02:00:00 da Guest »

Offline Z80Fan

  • Administrator
  • Guru
  • *****
  • Post: 1671
  • Karma: +13/-2
    • Mostra profilo
    • http://z80fan.altervista.org
Re: [C++][OpenGL] Texture trasparenti
« Risposta #2 il: 13 Novembre 2011, 18:31:24 »
Citazione da: "raistlin77it"
devi colorare i quads quando li disegni, per quello che sono neri  :) (non hai messo il colore )

prova a mettere  glColor3ub ( 255,255,255);  e vedrai che leggi le scritte :D
Avevo fatto molte combinazioni, mettendo il glColor sia prima del TexEnvi sia dopo, ma non ottenevo in nessun caso il risultato voluto.

Citazione
Anzi io i decal te li sconsiglierei, se metti ad esempio una funzione di blend classica tipo :
...
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);

e sei apposto.

Infatti è proprio quello che alla fine ho fatto. :)
Però non ho usato il GL_MODULATE, ma il GL_BLEND, perchè così con:

Codice: [Seleziona]
GLfloat colore[4] = {1.0f, 1.0f, 1.0, 1.0f}; // Colore del testo
glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, colore );
posso impostare il colore dei caratteri.

Citazione
/spiegazione "spannometrica" ON
I decal sono degli "stickers o figurine" che appiccichi su poligoni colorati per i quali hai bisogno di vedere sia il colore dell'oggetto, che ovviamente la "figurina" incollata sopra.  
Pensa ad esempio ad una macchina con incollata sulla portiera una pubblicità
/spiegazione "spannometrica" OFF
Ora che mi ci fai pensare diventa tutto più chiaro! :D
E mi spiego pure perchè quando impostavo il glColor cambiava lo sfondo ma non le scritte: era perchè cambiava il colore del quad, non della texture! :lol:

Bisognerebbe evitare di programmare sul tardi... ;)

Grazie cmq per l'aiuto!
« Ultima modifica: 01 Gennaio 1970, 02:00:00 da Guest »

Offline raistlin77it

  • Tech Guru
  • *****
  • Post: 221
  • Karma: +2/-0
    • Mostra profilo
Re: [C++][OpenGL] Texture trasparenti
« Risposta #3 il: 13 Novembre 2011, 21:00:35 »
di nulla :) pensa che io ti ho risposto alle 3.30 di matina :P
« Ultima modifica: 01 Gennaio 1970, 02:00:00 da Guest »

Tags: