OpenGL Textures form SDLSurface goes too dark

2019-04-27 03:05发布

问题:

I've quite the same problem than this OpenGl goes too dark but the answer doesn't work for me. I'm trying to display a image thanks to a surface converted to a texture and the result is too damn dark:

Original:

after openGL

On the left is the original, on the right the OpenGl img.

Here's my 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:

You probably have some state set elsewhere in your code that is still enabled when you want it disabled for drawing this quad.

Try putting the following after glBindTexture(GL_TEXTURE_2D, _texture); in your draw code (it's important that it's done in the draw method and not the createTextureFromSurface method):

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

If this works you can comment them out one at a time to figure out which state was causing your problem. Any state you disable for drawing this quad will need re-enabled when drawing the object that required it.