OpenGL Textures form SDLSurface goes too dark
Asked Answered
E

1

7

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:

enter image description here

after openGL

enter image description here

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);

}
Eula answered 5/6, 2013 at 9:38 Comment(17)
Can you reproduce it with other files?Encumbrancer
Unfortunately, yes, the issue (seems) to be independent of the file...Eula
Seems odd to pass nbOfColors for the internalFormat parameter of glTexImage2D.Yseult
@Yseult : I'm a little new to OpenGl, what would you do instead?Eula
You should pass a value from table1, table2 or table3 from opengl.org/sdk/docs/man/xhtml/glTexImage2D.xml. I'd suggest GL_RED, GL_RG, GL_RGB or GL_RGBA depending on whether nbOfColors is 1, 2, 3 or 4Rugging
I've tried with thoses 4 and it didn't changed anything.Eula
There are lots of other OpenGL states that could interfere here. For example, do you have lighting enabled? Or blending? What texture environment modes are you using? Is there maybe some multitexturing?Typhoid
@Typhoid : in my knowledge, there's no multitexturing and no lighting. Thoses two are called : glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);Eula
@VBB: so you use alpha blending. What alpha values does the texture have?Typhoid
@Typhoid it should be 0, to be sure I've made a copy without alpha channel and one on jpg, the result is the same.Eula
@VBB This may be a stupid question, but did you also try the suggestion in the comment on the answer of the question you linked, i.e. glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE?Rommel
@Rommel it doesn't work.Eula
glColor4f(1.0, 1.0, 1.0, 1.0) before you draw the quad? Also, why do you have blending on when drawing this texture in the first place? (Also, if you use a more modern GL version avoiding deprecated stuff you don't have to deal with this state madness)Cisco
@Cisco glColor4f() doesn't change anything neither, and I'm quite new to OpenGL so I don't know what's pertinent and what's not, but my soft does the work perfectly unless this problemEula
Well. I guess problems like this is one of the reasons to move away from fixed pipeline and do modern OpenGL. There you have full control of each fragment without interference from 1 gazillion weird states :DCisco
@Cisco that's a great advice, doesn't fix my problem but great, can you give me some links to learn modern OpenGL?Eula
opengl-tutorial.org and arcsynthesis.org/gltut/index.htmlCisco
D
6

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.

Deidradeidre answered 12/6, 2013 at 8:25 Comment(1)
diable lighting helps you.Retrusion

© 2022 - 2024 — McMap. All rights reserved.