加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – OpenGL纹理的奇怪事件

发布时间:2020-12-16 07:05:59 所属栏目:百科 来源:网络整理
导读:我相当肯定我的纹理加载没有问题,但是,我无法让它们渲染! 我初始化GL时启用GL_TEXTURE_2D.然后我用这个函数加载纹理: GLuint loadTexture(std::string filepath){ SDL_Surface *image; if ( image = SDL_LoadBMP( filepath.c_str() ) ) { GLuint tex_id; g
我相当肯定我的纹理加载没有问题,但是,我无法让它们渲染!

我初始化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,3,image->w,image->h,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>纹理.我可以遍历地图并验证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,iNode->verticies[2]);

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

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

glEnd();

一些值得注意的事情:

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

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

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

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

解决方法

从 SDL_LoadBMP文档:

Note: When loading a 24-bit Windows BMP file,pixel data points are loaded as blue,green,red,and NOT red,blue (as one might expect).

因此,提供给glTexImage2D的格式参数需要是GL_BGR.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读