c++ - 如何使用 Opengl 加载和显示纹理

标签 c++ opengl textures freeimage

我一直在尝试在 C++ 中使用 FreeImage 显示图像,但在执行此操作时遇到了很多麻烦。加载函数似乎加载了图像,但似乎没有绑定(bind)图像。 这是我到目前为止所得到的:

    GLuint Load(){
string imgdir = "Path to my file";
FREE_IMAGE_FORMAT fif = FreeImage_GetFIFFromFilename(imgdir.c_str());
FIBITMAP *bitmap = FreeImage_Load(fif,imgdir.c_str(),0);
int height, width;
height = FreeImage_GetHeight(bitmap);
width = FreeImage_GetWidth(bitmap);
GLuint textureid;
glGenTextures(1, &textureid);
glBindTexture(GL_TEXTURE_2D, textureid);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0,GL_RGBA, width, height, 0, GL_RGBA,        GL_UNSIGNED_BYTE, bitmap);
FreeImage_Unload(bitmap);
return textureid;}

void Square(){
glBindTexture(GL_TEXTURE_2D, tex);
glBegin(GL_QUADS);
glTexCoord2f(0.0, 0.0);glVertex3f(0.0, 0.0, 0.0);
glTexCoord2f(1.0, 0.0);glVertex3f(3.0, 0.0, 0.0);
glTexCoord2f(1.0, 1.0);glVertex3f(3.0, 5.0, 0.0);
glTexCoord2f(0.0, 1.0);glVertex3f(0.0, 5.0, 0.0);
glEnd();}

使用它我得到的只是一个白色矩形。在正确方向上的任何一点将不胜感激。

最佳答案

您传递的不是位,而是 freeimage 对象。您可以使用类似这样的方法来获取实际位:

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, width, height,
0, GL_BGRA, GL_UNSIGNED_BYTE, (void*)FreeImage_GetBits(bitmap));

确保输入图像的格式与 RGBA 匹配。

关于c++ - 如何使用 Opengl 加载和显示纹理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37222597/

相关文章:

c++ - 修改数据流的最有效方法

c++ - CRTP和template模板参数限制

c++ - 为什么传递对 Mutex 类的引用不是一个好的设计?

c++ - 无法编译wxWidget 3.0.5,OpenGL库不可用

OpenGL 4.4/ES 3.0 和缓存 channel 之间的顶点数据

opengl-es - GL_UNSIGNED_BYTE 对 glTexImage2D 意味着什么?

c++ - 在 C/C++ 中使用 AVX2 的两个无符号字节 vector 的内积

c++ - 从深度缓冲区值获取世界位置

opengl - 从先前绑定(bind)的纹理中检索像素 - OpenGL

DirectX 将后台缓冲区数据写入文件