2013-02-16 1 views
0

J'essaie actuellement de rendre des objets texturés dans Opengl. Tout fonctionnait bien jusqu'à ce que je veuille rendre une texture avec transparence. Au lieu de montrer l'objet transparent il vient de le rendre en noir total.DDS texture transparent rendu noir Opengl

La méthode fo chargement du fichier de texture est la suivante:

// structures for reading and information variables 
char magic[4]; 
unsigned char header[124]; 
unsigned int width, height, linearSize, mipMapCount, fourCC; 
unsigned char* dataBuffer; 
unsigned int bufferSize; 

fstream file(path, ios::in|ios::binary); 

// read magic and header 
if (!file.read((char*)magic, sizeof(magic))){ 
    cerr<< "File " << path << " not found!"<<endl; 
    return false; 
} 

if (magic[0]!='D' || magic[1]!='D' || magic[2]!='S' || magic[3]!=' '){ 
    cerr<< "File does not comply with dds file format!"<<endl; 
    return false; 
} 

if (!file.read((char*)header, sizeof(header))){ 
    cerr<< "Not able to read file information!"<<endl; 
    return false; 
} 

// derive information from header 
height = *(int*)&(header[8]); 
width = *(int*)&(header[12]); 
linearSize = *(int*)&(header[16]); 
mipMapCount = *(int*)&(header[24]); 
fourCC = *(int*)&(header[80]); 

// determine dataBuffer size 
bufferSize = mipMapCount > 1 ? linearSize * 2 : linearSize; 
dataBuffer = new unsigned char [bufferSize*2]; 

// read data and close file 
if (file.read((char*)dataBuffer, bufferSize/1.5)) 
    cout<<"Loading texture "<<path<<" successful"<<endl; 
else{ 
    cerr<<"Data of file "<<path<<" corrupted"<<endl; 
    return false; 
} 

file.close(); 

// check pixel format 
unsigned int format; 

switch(fourCC){ 
case FOURCC_DXT1: 
    format = GL_COMPRESSED_RGBA_S3TC_DXT1_EXT; 
    break; 
case FOURCC_DXT3: 
    format = GL_COMPRESSED_RGBA_S3TC_DXT3_EXT; 
    break; 
case FOURCC_DXT5: 
    format = GL_COMPRESSED_RGBA_S3TC_DXT5_EXT; 
    break; 
default: 
    cerr << "Compression type not supported or corrupted!" << endl; 
    return false; 
} 

glGenTextures(1, &ID); 


glBindTexture(GL_TEXTURE_2D, ID); 
glPixelStorei(GL_UNPACK_ALIGNMENT,1); 

unsigned int blockSize = (format == GL_COMPRESSED_RGBA_S3TC_DXT1_EXT) ? 8 : 16; 
unsigned int offset = 0; 

/* load the mipmaps */ 
for (unsigned int level = 0; level < mipMapCount && (width || height); ++level) { 
    unsigned int size = ((width+3)/4)*((height+3)/4)*blockSize; 
    glCompressedTexImage2D(GL_TEXTURE_2D, level, format, width, height, 
         0, size, dataBuffer + offset); 

    offset += size; 
    width /= 2; 
    height /= 2; 
} 

textureType = DDS_TEXTURE; 

return true; 

Dans le fragment shader je viens de mettre la gl_FragColor = Texture2D (myTextureSampler, UVcoords)

J'espère qu'il ya une explication facile telle comme un code manquant. Dans l'initialisation openGL, j'ai activé GL_Blend et défini une fonction de fusion.

Est-ce que quelqu'un a une idée de ce que j'ai fait de mal?

Répondre

2
  1. Assurez-vous que la fonction de fusion est la fonction correcte pour ce que vous essayez d'accomplir. Pour ce que vous avez décrit, cela devrait être glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

  2. Vous ne devriez probablement pas régler la fonction de mélange dans votre fonction d'initialisation openGL, mais devrait l'enrouler autour de votre tirage au sort des appels comme:

    glEnable(GL_BLEND) 
    glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); 
    
    //gl draw functions (glDrawArrays,glDrawElements,etc..) 
    
    glDisable(GL_BLEND) 
    
  3. Êtes-vous Clearing la texture 2D liant avant échangez des tampons? i.e. ...

+0

Merci pour vos suggestions. Malheureusement, l'inclusion de ces changements n'a pas fait de différence. Il me semble qu'il y a quelque chose qui ne va pas dans le chargement du dds ou du shader, peut-être. Si je définis une valeur alpha fixe pour le gl_FragColor, la transparence fonctionne. Seulement quand il est chargé de la texture de quelque chose qui ne va pas. –

+0

OMG! Je l'ai résolu. Tellement stupide. Au début, j'avais GL_BLEND activé seulement pour une partie des dessins, pas celle qui devait être transparente. Alors c'était correct mais la texture incorrecte a été chargée. Désolé de te déranger. Et merci encore pour votre aide. J'avais déjà abandonné ça. :RÉ –

Questions connexes