如何使用OpenGL加载并显示纹理

3

我一直在尝试使用C++中的FreeImage来显示图像,但一直遇到很多问题。虽然load函数似乎成功加载了图像,但它似乎没有绑定图像。以下是我的代码:

    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();}

我只能看到一个白色矩形,希望能得到正确的指引。

1个回答

2
您并没有传递位,而是FreeImage对象。您可以使用以下代码获取实际位:

你可能会用到这个:

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

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


由于某些原因,它似乎仍然无法正常工作。还有其他可以修复的问题吗?感谢您的帮助。 - user11046
1
你使用的图片格式是什么?你可能需要不同的标志。你还可以尝试打印宽度、高度或其他信息,以确保 FreeImage 正确加载了图像。 - Kamyar Infinity
我正在使用JPEG格式。它显示了正确的高度和宽度,并且我之前通过加载后将图像另存为新图像进行了测试,因此似乎工作正常。 - user11046
对于JPEG格式,您没有透明度,因此应该使用类似以下的内容:glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, (void*)FreeImage_GetBits(bitmap))。如果这不起作用,我认为问题在于FreeImage_GetBits的输出具有不同的对齐方式,您需要提前显式地创建缓冲区,如此处所述。 - Kamyar Infinity

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接