2013-06-05 11 views
7

私はこのOpenGl goes too darkよりもかなり同じ問題を抱えていますが、答えがうまくいきません。私は、表面のおかげでテクスチャに変換され、結果があまりにも気暗い画像を表示しようとしている:OpenGLテクスチャフォームSDLSurfaceが暗すぎます

オリジナル:OpenGLの

enter image description here

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

glTexImage2Dの 'internalFormat'パラメータに' nbOfColors'を渡すのは奇妙です。 – Brian

答えて

5

あなたはおそらく、あなたがこのクワッドを描画することが無効にするとき、まだ有効になっているあなたのコード内の別の場所に設定され、いくつかの状態を持っています。

glBindTexture(GL_TEXTURE_2D、_texture)の後に次のように入力してください。あなたのドローコードで(それはそれはcreateTextureFromSurface方法drawメソッドではなく行うのが重要です):これが動作する場合

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

関連する問題