Opengl 使用FreeImage加载图像
我试图学习OpenGL教程,但是教程使用了SOIL(这对我不适用),我使用了FreeImage 你能告诉我为什么我的代码不起作用吗 教程代码:Opengl 使用FreeImage加载图像,opengl,2d,freeimage,Opengl,2d,Freeimage,我试图学习OpenGL教程,但是教程使用了SOIL(这对我不适用),我使用了FreeImage 你能告诉我为什么我的代码不起作用吗 教程代码: // Load texture GLuint tex; glGenTextures(1, &tex); int width, height; unsigned char* image = SOIL_load_image("sample.png", &width, &height, 0, SOIL_LOAD_RGB); glTex
// Load texture
GLuint tex;
glGenTextures(1, &tex);
int width, height;
unsigned char* image = SOIL_load_image("sample.png", &width, &height, 0, SOIL_LOAD_RGB);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, image);
SOIL_free_image_data(image);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
我的代码:
// Load textures
GLuint tex;
glGenTextures(1, &tex);
int width, height;
FREE_IMAGE_FORMAT formato = FreeImage_GetFileType("sample.png",0);
FIBITMAP* imagen = FreeImage_Load(formato, "sample.png");
FIBITMAP* temp = imagen;
imagen = FreeImage_ConvertTo32Bits(imagen);
FreeImage_Unload(temp);
width = FreeImage_GetWidth(imagen);
height = FreeImage_GetHeight(imagen);
GLubyte* textura = new GLubyte[4*width*height];
char* pixeles = (char*)FreeImage_GetBits(imagen);
for(int j= 0; j<width*height; j++)
{
textura[j*4+0]= pixeles[j*4+2];
textura[j*4+1]= pixeles[j*4+1];
textura[j*4+2]= pixeles[j*4+0];
textura[j*4+3]= pixeles[j*4+3];
}
glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA, width, height, 0, GL_RGBA,GL_UNSIGNED_BYTE,(GLvoid*)textura );
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
//加载纹理
胶合特克斯;
glGenTextures(1和tex);
int宽度、高度;
FREE_IMAGE_FORMAT FORMAT=FreeImage_GetFileType(“sample.png”,0);
FIBITMAP*imagen=FreeImage_Load(formato,“sample.png”);
FIBITMAP*temp=imagen;
imagen=自由图像_转换为32位(imagen);
FreeImage_卸载(温度);
宽度=自由图像宽度(图像n);
高度=自由图像高度(图像n);
GLubyte*textura=新GLubyte[4*宽度*高度];
char*像素=(char*)自由图像_GetBits(imagen);
对于(int j=0;j,您似乎从未绑定您创建的纹理对象
在尝试使用纹理进行渲染之前,在glGenTextures()之后添加一个glBindTexture(GL\u TEXTURE\u 2D,tex)
调用,然后再次添加该调用。用C编写代码非常有趣。
你是程序员。你最好调试你的程序,因为OpenGL应用程序中的“黑屏”可能是由无数不同的原因造成的。从我们的角度来看,我们只能猜测。我们不喜欢它
我猜
(好吧,有时候我们喜欢猜测)
这:
您的temp
和imagen
指向同一个位置,因此在FreeImage_Unload(temp);
之后,这两个点都指向…我们不知道在哪里。然后您从中获得像素:
char*pixeles=(char*)FreeImage\u GetBits(imagen);
它会返回什么?我们不知道。你不会检查之后是否存在像素。
未定义的行为等。它甚至不会崩溃。
另外,在AFAIR中,您不能同时读取和写入dib
相反,你应该:
FREE_IMAGE_FORMAT formato = FreeImage_GetFileType("sample.png",0);
if(formato == FIF_UNKNOWN) { /* go angry here */ }
FIBITMAP* imagen = FreeImage_Load(formato, "sample.png");
if(!imagen ) { /* go very angry here */ }
FIBITMAP* temp = FreeImage_ConvertTo32Bits(imagen);
if(!imagen) { /* go mad here */ }
FreeImage_Unload(imagen);
imagen = temp;
(或者只是注释掉所有转换内容)
如何调试:
- 加载和处理图像后检查错误。是否加载图像
- 检查OpenGL错误。一切正常吗
- 在“像素着色器”(pixel shader)中,将“输出颜色”(output color)设置为白色,这样可以确保几何体是良好的(什么?不使用着色器?=()
- 纹理加载后,将其直接写入
.raw
文件(或其他格式),并使用位图编辑器进行检查
如何检查错误:
仔细阅读FreeImage文档和教程示例。查看错误检查实现。基本上,您需要设置回调函数。实现它。设置它。(或至少复制粘贴)。对OpenGL执行相同的+glGetError()
快乐编码!=)
编辑:FreeImage具有SwapRedBlue32()
helper函数,因此循环不需要这些函数。好的,我找到了问题的答案。:p
我必须在“Debug”文件夹中启动应用程序,而不是用VC++调试它
唯一的问题是,现在加载的图片是颠倒的,但我想我可以在更改for循环时修复它
谢谢您的回答!您的代码似乎很好,只有“imagen=temp;”会导致应用程序崩溃,但没有这一行就可以工作。无法让SwapRedBlue32()工作,但我的循环工作正常。您知道一个好方法来旋转图片吗?您可以使用FreeImage\u Rotate()
。有关详细信息,请从下载文档。同时检查FreeImage\u SetOutputMessage
函数。因此,下次我们无需猜测代码失败的位置=)在这种情况下是否可以使用imagen=FreeImage\u FlipHorizontal(imagen)
?因为我不能让它工作,因为它返回一个布尔值。通过旋转,它可以工作,但它是垂直翻转的:/。使用bool result=FreeImage\u FlipHorizontal(imagen)代码>它将更改imagen
,无需复制到另一个变量。不要忘记在:如果(!result){/*错误消息在这里*/}
之后检查EROR。因此,您的程序无法找到指定的图片文件。要在Visual Studio调试器下设置程序启动时的工作目录:右键单击项目
->属性
->调试
->工作目录
。
FREE_IMAGE_FORMAT formato = FreeImage_GetFileType("sample.png",0);
if(formato == FIF_UNKNOWN) { /* go angry here */ }
FIBITMAP* imagen = FreeImage_Load(formato, "sample.png");
if(!imagen ) { /* go very angry here */ }
FIBITMAP* temp = FreeImage_ConvertTo32Bits(imagen);
if(!imagen) { /* go mad here */ }
FreeImage_Unload(imagen);
imagen = temp;