2009-04-15 13 views
5

Ho cercato di fare ricerche su Google ma non mi sembra che ci siano risposte semplici e coerenti. È perché non è semplice o perché non sto usando le parole chiave corrette?Come si rendono trasparenti le trame in OpenGL?

Tuttavia, questo è il progresso che ho fatto finora.

  1. Creato 8 vertici per formare 2 quadrati.
  2. Creata una trama con un valore alfa a 200 bit (quindi, circa l'80% trasparente).
  3. Assegnata la stessa trama a ogni quadrato, che mostra correttamente.
  4. Notato che quando uso una trama con 255 alpha, appare più luminoso.

L'init è qualcosa di simile al seguente:

glClearColor(0.0, 0.0, 0.0, 0.0); 
glShadeModel(GL_FLAT); 
glEnable(GL_DEPTH_TEST); 

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

glPixelStorei(GL_UNPACK_ALIGNMENT, 1); 
glGenTextures(1, textureIds); 
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); 

int i, j; 
GLubyte pixel; 
for (i = 0; i < TEXTURE_HEIGHT; i++) 
{ 
    for (j = 0; j < TEXTURE_WIDTH; j++) 
    { 
     pixel = ((((i & 0x8) == 0)^((j & 0x8) == 0)) * 255); 
     texture[i][j][0] = pixel; 
     texture[i][j][1] = pixel; 
     texture[i][j][2] = pixel; 
     texture[i][j][3] = 200; 
    } 
} 

glBindTexture(GL_TEXTURE_2D, textureIds[0]); 

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 

glTexImage2D(
    GL_TEXTURE_2D, 0, GL_RGBA, 
    TEXTURE_WIDTH, TEXTURE_HEIGHT, 
    0, GL_RGBA, GL_UNSIGNED_BYTE, texture); 

Questo è in qualche modo simile al frammento di codice dalla pagina 417 del libro, OpenGL Programming Guide, e crea un motivo di controllo.

E poi, la funzione di visualizzazione contiene ...

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
glEnable(GL_TEXTURE_2D); 

// Use model view so that rotation value is literal, not added. 
glMatrixMode(GL_MODELVIEW); 
glPushMatrix(); 

// ... translation, etc ... 

glBindTexture(GL_TEXTURE_2D, textureIds[0]); 
glBegin(GL_QUADS); 
glTexCoord2f(0.0, 0.0); glVertex3f(-1.0, +1.0, 0.0); // top left 
glTexCoord2f(0.0, 1.0); glVertex3f(-1.0, -1.0, 0.0); // bottom left 
glTexCoord2f(1.0, 1.0); glVertex3f(+1.0, -1.0, 0.0); // bottom right 
glTexCoord2f(1.0, 0.0); glVertex3f(+1.0, +1.0, 0.0); // top right 
glEnd(); 

    // not neccecary to repeat, just good practice 
glBindTexture(GL_TEXTURE_2D, textureIds[0]); 
glBegin(GL_QUADS); 
glTexCoord2f(0.0, 0.0); glVertex3f(-0.5, +1.0, -1.0); // top left 
glTexCoord2f(0.0, 1.0); glVertex3f(-0.5, -1.0, -1.0); // bottom left 
glTexCoord2f(1.0, 1.0); glVertex3f(+1.5, -1.0, -1.0); // bottom right 
glTexCoord2f(1.0, 0.0); glVertex3f(+1.5, +1.0, -1.0); // top right 
glEnd(); 

glFlush(); 
glDisable(GL_TEXTURE_2D); 

glPopMatrix(); 

SwapBuffers(); 

Quindi, questo rende un 2 ° piazza in background; Posso vedere questo ma sembra che sei stato mescolato con lo sfondo (presumo questo perché sono più scuri con 200 alfa po 'di 255 bit) invece della trama dietro ...

Transparent textures not working

Come puoi vedere, nessuna trasparenza ... Come posso risolvere questo?

+0

Hai TEXTURE_HEIGHT due volte in quel ciclo, invece di TEXTURE_WIDTH – shoosh

+0

Ah grazie, ma che non importa quanto sono entrambi 64. –

risposta

9

Quindi l'altra risposta che era presente ma è stata eliminata menzionava questo: in generale, per il corretto funzionamento della fusione alfa è necessario ordinare gli oggetti da lontano a vicino nel sistema di coordinate della telecamera.
Ecco perché i poligoni si fondono con lo sfondo. Puoi confermare che questo è davvero il problema disabilitando il test di profondità. Senza test di profondità vengono visualizzati tutti i frammenti e sarete in grado di vedere la fusione alfa.

Più su questo in this page.

Problemi correlati