2013-06-05 11 views
7

Ich habe ziemlich das gleiche Problem als dieses OpenGl goes too dark, aber die Antwort funktioniert nicht für mich. Ich versuche, ein Bild dank einer Oberfläche zu einer Textur und das Ergebnis ist auch verdammt dunkel umgewandelt anzuzeigen:OpenGL Texturen Formular SDLSurface geht zu dunkel

Original:

enter image description here

nach openGL

enter image description here

Links ist das Original, rechts das OpenGl img.

Hier ist mein Code:

void TexturedRect::draw(int scroll){ 

    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 

    glBindTexture(GL_TEXTURE_2D, _texture); 

    glEnable(GL_TEXTURE_2D); 
    glBegin(GL_QUADS); //Begining the cube's drawing 

    int x = this->getX(); 
    int y = this->getY(); 
    int w = this->getWidth(); 
    int h = this->getHeight(); 
    int z = this->getZ(); 

    /* 
    (0,0) ------ (1,0) 
     |   | 
     |   | 
    (0,1) ------ (1,1) 
    */ 
    glTexCoord3i(0, 0, 1);glVertex3i(x + scroll,   y,  z); 
    glTexCoord3i(_tv, 0, 1);glVertex3i(x + w * _tv + scroll,  y,  z); 
    glTexCoord3i(_tv, _tu, 1);glVertex3i(x + w * _tv + scroll,  y + h * _tu, z); 
    glTexCoord3i(0, _tu, 1);glVertex3i(x + scroll,   y + h * _tu, z); 

    glEnd(); 
    glDisable(GL_TEXTURE_2D); 
} 

void TexturedRect::createTextureFromSurface() 
{ 
    SDL_Surface * surface = IMG_Load(filename.toStdString().c_str()); 
    // get the number of channels in the SDL surface 
    GLint nbOfColors = surface->format->BytesPerPixel; 
    GLenum textureFormat = 0; 

    switch (nbOfColors) { 
    case 1: 
     textureFormat = GL_ALPHA; 
     break; 
    case 3:  // no alpha channel 
     if (surface->format->Rmask == 0x000000ff) 
      textureFormat = GL_RGB; 
     else 
      textureFormat = GL_BGR; 
     break; 
    case 4:  // contains an alpha channel 
     if (surface->format->Rmask == 0x000000ff) 
      textureFormat = GL_RGBA; 
     else 
      textureFormat = GL_BGRA; 
     break; 
    default: 
     qDebug() << "Warning: the image is not truecolor..."; 
     break; 
    } 

    glEnable(GL_TEXTURE_2D); 
    // Have OpenGL generate a texture object handle for us 
    glGenTextures(1, &_texture); 

    // Bind the texture object 
    glBindTexture(GL_TEXTURE_2D, _texture); 


    // Edit the texture object's image data using the information SDL_Surface gives us 
    glTexImage2D(GL_TEXTURE_2D, 0, nbOfColors, surface->w, surface->h, 0, 
        textureFormat, GL_UNSIGNED_BYTE, surface->pixels); 

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 

} 
+1

Können Sie es mit anderen Dateien reproduzieren? –

+0

Leider scheint das Problem (scheint) unabhängig von der Datei zu sein ... –

+0

Scheint seltsam, 'nbOfColors' für den' internalFormat' Parameter von glTexImage2D zu übergeben. – Brian

Antwort

5

Sie haben wahrscheinlich einige Zustand an anderer Stelle im Code festgelegt, die noch aktiviert ist, wenn Sie es für die Erstellung dieses Quad deaktiviert werden soll.

Versuchen Sie Folgendes nach glBindTexture (GL_TEXTURE_2D, _texture); in Ihrem Draw-Code (es ist wichtig, dass es in der Streck-Verfahren und nicht die createTextureFromSurface Methode durchgeführt wird):

glDisable(GL_BLEND); 
glDisable(GL_LIGHTING); 
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE) 
glColor3f(1.0f, 1.0f, 1.0f); 

Wenn dies funktioniert, wie Sie sie aus einer nach dem anderen, um herauszufinden, kommentieren, welcher Staat das Problem verursacht wurde. Jeder Zustand, den Sie zum Zeichnen dieses Quads deaktivieren, muss beim Zeichnen des Objekts, das es benötigt, wieder aktiviert werden.

+2

Gut gemacht. GL_BLEND war der Schuldige! Hier sind Sie 100rep! –

+0

diable Beleuchtung hilft Ihnen. – xqterry