2013-06-05 2 views
7

У меня такая же проблема, как у этого OpenGl goes too dark, но ответ не работает для меня. Я стараюсь, чтобы отобразить изображение благодаря поверхности превращается в текстуру, и результат тоже чертовски темно:OpenGL Textures form SDLSurface идет слишком темным

Оригинал:

enter image description here

после OPENGL

enter image description here

Слева находится оригинал, справа - OpenGl img.

Вот мой код:

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

Можете ли вы воспроизвести его другими файлами? –

+0

К сожалению, да, проблема (кажется) не зависит от файла ... –

+0

Кажется странным передавать 'nbOfColors' для параметра' internalFormat' glTexImage2D. – Brian

ответ

5

Вы, вероятно, некоторые множество состояний в другом месте в коде, который все еще активен, когда вы хотите его выключенным для рисования этого четырехугольника.

Попробуйте поместить следующее после glBindTexture (GL_TEXTURE_2D, _texture); в вашем коде дро (это важно, что это делается в методе вытягивания и не метод createTextureFromSurface):

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

Если это работает, Вы можете прокомментировать их по одному за раз, чтобы выяснить, какие состояния является причиной проблемы. Любое состояние, которое вы отключили для рисования этого квадрата, нуждается в повторной активации при рисовании требуемого объекта.

+2

Молодцы. GL_BLEND был виновником! Вот вы 100rep! –

+0

Диодное освещение помогает вам. – xqterry