2013-06-05 20 views
7

Ho lo stesso problema di questo OpenGl goes too dark ma la risposta non funziona per me. Sto cercando di visualizzare un'immagine grazie ad una superficie convertita in una texture e il risultato è troppo dannatamente buio:OpenGL Textures form SDLSurface diventa troppo scuro

originale:

enter image description here

dopo openGL

enter image description here

A sinistra è l'originale, a destra l'OpenGl img.

Ecco il mio codice:

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

Puoi riprodurlo con altri file? –

+0

Sfortunatamente, sì, il problema (sembra) di essere indipendente dal file ... –

+0

Sembra strano passare 'nbOfColors' per il parametro' internalFormat' di glTexImage2D. – Brian

risposta

5

Probabilmente avete qualche stato impostato altrove nel codice che è ancora attivato quando si vuole disabilitato per disegnare questo quad.

Provare a inserire quanto segue dopo glBindTexture (GL_TEXTURE_2D, _texture); nel codice draw (è importante che si fa nel metodo draw e non il metodo createTextureFromSurface):

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

Se funziona è possibile commentare uno alla volta per capire quale stato è stata la causa del problema. Qualsiasi stato che si disabilita per disegnare questo quadruplo sarà necessario riattivare quando si disegna l'oggetto che lo richiede.

+2

Ben fatto. GL_BLEND era il colpevole! Eccoti qui! –

+0

illuminazione diable ti aiuta. – xqterry