c – OpenGL纹理形式SDLSurface太暗了

我的问题与这个 OpenGl goes too dark完全相同,但答案对我不起作用.我试图通过转换为纹理的表面来显示图像,结果太黑了:

原版的:

在openGL之后

左边是原版,右边是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,1);glVertex3i(x + scroll,y,z);
    glTexCoord3i(_tv,1);glVertex3i(x + w * _tv + scroll,_tu,y + h * _tu,z);
    glTexCoord3i(0,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,nbOfColors,surface->w,surface->h,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);

}

解决方法

您可能在代码中的其他位置设置了一些状态,当您希望禁用它来绘制此四边形时,该状态仍然处于启用状态.

尝试在glBindTexture(GL_TEXTURE_2D,_texture)之后添加以下内容;在你的绘图代码中(重要的是它在draw方法中完成而不是createTextureFromSurface方法):

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

如果这样可行,您可以逐个注释掉它们,以确定导致问题的状态.绘制此四边形时禁用的任何状态都需要在绘制需要它的对象时重新启用.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...