我正在尝试遵循 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);
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);
我的“解决方案”只会导致一个黑色窗口(没有错误)。
最佳答案
用 C 语言编码很有趣
你是程序员。你最好调试你的程序,因为 OpenGL 应用程序中的“黑屏”可能是由无数不同的原因引起的。从我们的角度来看,我们只能猜测。我们不喜欢它。
我的猜测
(好吧,有时我们喜欢猜测)
这个:
FIBITMAP* temp = imagen;
imagen = FreeImage_ConvertTo32Bits(imagen);
FreeImage_Unload(temp);
您的
temp
和 imagen
指向同一个地方,所以在 FreeImage_Unload(temp);
之后两者都指向……我们不知道在哪里。然后你从中得到像素:char* pixeles = (char*)FreeImage_GetBits(imagen);
它返回什么?我们不知道。你不检查是否
pixels
之后存在。未定义的行为等。它甚至不会崩溃。
另外,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;
(或者只是注释掉所有转换的东西)
如何调试:
.raw
文件(或其他格式)并使用位图编辑器检查它 如何检查错误:
仔细阅读 FreeImage 文档和教程示例。查看错误检查实现。基本上,您需要设置回调函数。实现它。设置它。 (或至少复制粘贴)。做同样的 +
glGetError()
对于 OpenGL。快乐编码! =)
编辑: FreeImage 有
SwapRedBlue32()
辅助函数,所以你不需要那些 for 循环。
关于opengl - 使用 FreeImage 加载图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19606736/