OpenGL纹理的奇怪事件

时间:2013-09-25 17:59:41

标签: c++ opengl textures

我相当肯定我的纹理加载没有问题,但是,我无法让它们渲染!

我在初始化GL时启用GL_TEXTURE_2D。然后我用这个函数加载纹理:

GLuint loadTexture(std::string filepath)
{
    SDL_Surface *image;
    if ( image = SDL_LoadBMP( filepath.c_str() ) )
    {
        GLuint tex_id;
        glGenTextures( 1, &tex_id );
        glBindTexture( GL_TEXTURE_2D, tex_id );

        glTexImage2D(   GL_TEXTURE_2D, 0, 3, image->w,
                        image->h, 0, GL_RGB,
                        GL_UNSIGNED_BYTE, image->pixels );

        SDL_FreeSurface(image);

        glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
        glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );

        textures.emplace(getFilename(filepath), tex_id);

        glBindTexture(GL_TEXTURE_2D, 0);

        return tex_id;
    }
    else
    {
        // std::cout << "[!!] Could not open " << filepath << "! \n";
        return -1;
    }
}

加载纹理,然后将纹理名称放在地图中,文件名作为键。地图是全局定义为std::map <std::string, GLuint> textures。我可以遍历地图并验证GL正确分配纹理名称。最后,我继续画出我的四边形:

glBindTexture(GL_TEXTURE_2D, textures["MY_IMAGE.BMP"]);

glBegin(GL_QUADS);

glTexCoord2f(0.0, 0.0);
glVertex3d(0.0,  0.0, iNode->verticies[1]);

glTexCoord2f(1.0, 0.0);
glVertex3d(1.0,  0.0, iNode->verticies[2]);

glTexCoord2f(1.0, 1.0);
glVertex3d(1.0,  1.0, iNode->verticies[3]);

glTexCoord2f(0.0, 1.0);
glVertex3d(0.0,  1.0, iNode->verticies[4]);

glEnd();

值得注意的一些事情:

  • 这些四边形的颜色已在绘图前定义。如果我 注释掉所有格式的颜色定义 glColor3ub(r, g, b),四边形渲染为黑色。
  • 如果我拨打glIsTexture(textures["MY_IMAGE.BMP"]),则会返回false。
  • 纹理名称仍然正确存储在地图中。
  • 我正在使用OpenGL 2.1。

纹理是否以某种方式在内部删除?我的渲染有问题吗?

如果需要,我愿意提供更多代码。

修改 我不知道我做了什么...... 现在我的渲染看起来像这样:enter image description here

1 个答案:

答案 0 :(得分:1)

来自SDL_LoadBMP文档:

  

注意:加载24位Windows BMP文件时,像素数据点将加载为蓝色,绿色,红色和非红色,绿色,蓝色(正如人们所料)。

因此,提供给glTexImage2D的格式参数必须为GL_BGR