【问题标题】:Odd happenings of OpenGL TexturingOpenGL纹理的奇怪事件
【发布时间】:2013-09-25 17:59:40
【问题描述】:

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

我在初始化 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 &lt;std::string, GLuint&gt; 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。

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

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

编辑: 我不知道我做了什么... 现在我的渲染看起来像这样:

【问题讨论】:

  • glGetError()glGenTextures() 调用后是否返回任何内容?
  • glGetError 没有报错! D:
  • 是的,最好发SSCCE
  • 尝试在glTexImage2D()之前删除glPixelStorei(GL_UNPACK_ALIGNMENT, 1)
  • 没有区别。我会尝试组建一个 SSCCE。

标签: c++ opengl textures


【解决方案1】:

来自SDL_LoadBMP 文档:

注意:加载 24 位 Windows BMP 文件时,像素数据点加载为蓝色、绿色、红色,而不是红色、绿色、蓝色(正如人们所期望的那样)。

因此提供给glTexImage2D的格式参数需要为GL_BGR

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-08
    • 1970-01-01
    • 2020-01-27
    • 1970-01-01
    相关资源
    最近更新 更多