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?
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. –
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É –