我相当肯定我的纹理加载没有问题,但是,我无法让它们渲染!
我在初始化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。 纹理是否以某种方式在内部删除?我的渲染有问题吗?
如果需要,我愿意提供更多代码。
修改
我不知道我做了什么......
现在我的渲染看起来像这样:
答案 0 :(得分:1)
来自SDL_LoadBMP文档:
注意:加载24位Windows BMP文件时,像素数据点将加载为蓝色,绿色,红色和非红色,绿色,蓝色(正如人们所料)。
因此,提供给glTexImage2D的格式参数必须为GL_BGR
。