Bienvenue, Invité. Merci de vous connecter ou de vous inscrire.
Avez-vous perdu votre e-mail d'activation ?

Auteur Sujet: [Résolu] Problème avec Texture 3D et texture 2D array d'OpenGL  (Lu 2739 fois)

0 Membres et 1 Invité sur ce sujet

Timidouveg

  • Full Member
  • ***
  • Messages: 164
    • Voir le profil
    • Démiurge - Mon jeu-vidéo en développement
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 :)
« Modifié: Juillet 14, 2013, 05:32:06 pm par Timidouveg »
C'est simple, c'est rapide, c'est libre et en plus c'est français ? Qu'est-ce que vous attendiez pour m'en parler ?

Timidouveg

  • Full Member
  • ***
  • Messages: 164
    • Voir le profil
    • Démiurge - Mon jeu-vidéo en développement
Re : Problème avec Texture 3D et texture 2D array d'OpenGL
« Réponse #1 le: Juillet 14, 2013, 05:31:12 pm »
J'ai finalement résolu tout les problèmes qui venaient de 3 choses :
- Sur mon ordinateur, je ne dois pas utiliser EXT dans les noms, après c'est peut-être différent sur d'autres machines.
- J'ai initialisé mon espace pour la texture 3D avec un mipmap à 1 alors que je ne m'en servais pas. Je pensais qu'il en fallait au moins 1, mais ça s'écrit 0 tout simplement pour la base.
- Et là ce qui concerne SFML, pour faire la copie des morceaux d'image il fallait qu'en interne SFML active GL_TEXTURE_2D, hors il se trouvait dans mon contexte GL_TEXTURE_3D.

Durant mes tentatives, SFML s'est trouvé instable dans sa partie shader, dans ses dessins et peut-être même les coordonnées de certains sprites et même à un moment il ne savait plus gérer l'affichage tout court.
C'est con, mais que SFML fasse de l'OpenGL en interne et donc puisse faire un truc qu'on veut justement faire autrement est une chose qu'on oublie parfois. Bref, j'espère ne pas avoir polluer ce forum avec mon sujet, et que ça servira à ceux qui auraient utilisé des types de textures différents et rencontreraient des gros bugs :)

Dans mon cas et dans d'autres, vaut-il peut-être mieux utiliser une librairie complémentaire (exemple FreeImage) pour charger et manipuler des images avant de les charger dans la carte graphique ?
C'est simple, c'est rapide, c'est libre et en plus c'est français ? Qu'est-ce que vous attendiez pour m'en parler ?