Bonjour à tous
Je rencontre un soucis pour passer les pixels d'une sf::Image à un glSubTexture3D soit en mode GL_TEXTURE_2D_ARRAY ou en mode GL_TEXTURE_3D, ainsi qu'avec l'écriture suivit de _EXT. Glew est bien initialisé et les extensions correspondantes sont bien vérifiées.
Une fois l'espace de la texture 3D ou 2D array allouée, j'envoie mes images une par une de façon à les avoir couche par couche et ainsi les manipuler via un shader au travers d'un seul appel de dessin d'objets instanciés. C'est pour expérimenter une optimisation de mon rendu.
Le programme plante lorsque j'utilise glSubTexture3D avec la méthode getPixelsPtr() de mon image.
void TexturesManager::LoadTextures(const std::string& stFileName, GLint iLayersCount) {
// Récupération des textures dans le fichier
sf::Image *psfImage = new sf::Image();
if ( !psfImage ) {
std::cerr << "Allocation de texture impossible" << std::endl;
exit(1);
}
psfImage->loadFromFile("data/materials/textures/blocks/static/"+stFileName+".png");
// Préparation au découpage des textures
GLuint uiImageW = psfImage->getSize().x;
sf::Image sfTexImage;
sfTexImage.create(32, 32);
glEnable(GL_TEXTURE_2D_ARRAY_EXT);
// Allocation de l'espace de stockage des textures dans la carte graphique
glGenTextures(1, &this->m_uiBlocksTexID);
glBindTexture(GL_TEXTURE_2D_ARRAY_EXT, this->m_uiBlocksTexID);
glTexImage3DEXT(GL_TEXTURE_2D_ARRAY_EXT, 1, GL_RGBA8, 32, 32, iLayersCount, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
glTexParameteri(GL_TEXTURE_2D_ARRAY_EXT, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D_ARRAY_EXT, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D_ARRAY_EXT, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D_ARRAY_EXT, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
// Découpage et stockage des textures dans la carte graphique
GLuint uiX = 0, uiY = 0;
for (GLuint iLayer = 0 ; iLayer < iLayersCount ; iLayer++) {
sfTexImage.copy(*psfImage, 0, 0, sf::IntRect(uiX, uiY, uiX+32, uiY+32), GL_TRUE);
glTexSubImage3DEXT(GL_TEXTURE_2D_ARRAY_EXT, 0, 0, 0, iLayer, 32, 32, 1, GL_RGBA, GL_UNSIGNED_BYTE, sfTexImage.getPixelsPtr());
iLayer++;
uiX += 32;
if (uiX < uiImageW) {
uiX = 0;
uiY += 32;
}
}
glDisable(GL_TEXTURE_2D_ARRAY_EXT);
glEnable(GL_TEXTURE_2D); // En raison d'un autre problème j'ai essayé ceci, mais ça ne change rien :s
// Suppression de l'image du fichier
delete psfImage;
}
Un autre problème se présente, que j'ai essayer de résoudre entre autres par glEnable(GL_TEXTURE_2D); que vous pouvez voir commenté. Dans une autre partie de mon code, deux shaders SFML sont initialisés pour faire du flou pour l'écran de pause du jeu. Tout fonctionne bien lorsque je commente à partir de glTexImage3DEXT(GL_TEXTURE_2D_ARRAY_EXT, 1, GL_RGBA8, 32, 32, iLayersCount, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);, mais si je libère ce dernier, les shaders de SFML plantent à l'initialisation. Ces shaders et la zone du code n'ont rien à voir avec les textures 3D ou 2D array. Mon flou travaille sur une texture 2D de la scène de jeu sans l'interface, rendu par un FBO.
J'espère avoir été clair, si ce n'est pas le cas, j'essaierais d'apporter le plus de précisions possible