2017-01-08 4 views
-1

Note: J'utilise OpenGL héritageSDL2 (C++) pas toutes les images .png rendent correctement

J'ai rencontré un problème où seulement quelques images .png se correctement rendus.

Voici une capture d'écran exemple de jeu rendu (Gauche: enemyRed.png, Droite: (ship.png)):

Screenshot of rendered game

Voici le code que j'utilise pour charger des images:

SpriteImage* SDLOpenGL::loadImage(std::string path) { 
    SDL_Surface * surface = IMG_Load(path.c_str()); 
    SpriteImage * image = new SpriteImage(&*surface); 

    return image; 
} 

Voici la classe SpriteImage:

SpriteImage::SpriteImage(SDL_Surface *surface) { 
    this->surface = surface; 
    this->TextureID = 0; 
} 

void SpriteImage::bind() { 
    glTexImage2D(GL_TEXTURE_2D, 
      0, 
      this->mode, 
      this->surface->w, 
      this->surface->h, 
      0, 
      this->mode, 
      GL_UNSIGNED_BYTE, 
      this->surface->pixels 
      ); 
    glBindTexture(GL_TEXTURE_2D, this->TextureID); 
} 

int SpriteImage::getWidth() { 
    return this->surface->w; 
} 

int SpriteImage::getHeight() { 
    return this->surface->h; 
} 

Voici où je rends les images:

(note, this->getCurrentImage() renvoie un "SpriteImage")

void Sprite::draw(float delta) { 
    this->getCurrentImage()->bind(); 

    glBegin(GL_QUADS); 
    glTexCoord2f(0, 0); 
    glVertex2f(0.0f, 0.0f); 

    glTexCoord2f(0, 1); 
    glVertex2f(0.0f, this->getHeight()); 

    glTexCoord2f(1, 1); 
    glVertex2f(this->getWidth(), this->getHeight()); 

    glTexCoord2f(1, 0); 
    glVertex2f(this->getWidth(), 0.0f); 
    glEnd(); 

    this->next(); 
} 
+0

Voici les images btw: http://imgur.com/a/a5zNW – ianertson

Répondre

0
  • L'image qui ne rend pas a une largeur indivisible par quatre. Vous devez utiliser glPixelStorei avec GL_UNPACK_ALIGNMENT avant glTexImage2D pour spécifier l'alignement de vos lignes en mémoire - qui sont probablement non alignées (OpenGL suppose par défaut qu'ils sont aligné sur quatre octets).

  • Vous devez d'abord glBindTexture et puis télécharger les données avec glTexImage2D. Avez-vous déjà appelé glGenTextures? Vous devez initialiser TextureID avec glGenTextures.

  • Vous ne devez pas télécharger la texture à chaque fois que vous liez la texture. Au lieu de le télécharger dans le constructeur, puis pour changer de texture, vous devez seulement glBindTexture votre TextureID.