我正在尝试遵循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);
我的“解决方案”只会导致黑色窗口(没有错误)。
答案 0 :(得分:3)
你是程序员。你最好调试你的程序,因为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文档和教程示例。查看错误检查实现。基本上,您需要设置回调函数。实施它。设置它。 (或至少复制粘贴)。对OpenGL执行相同的+ glGetError()
。
快乐的编码! =)
编辑:FreeImage具有SwapRedBlue32()
辅助函数,因此您不需要那些for循环。
答案 1 :(得分:0)
您似乎永远不会绑定您创建的纹理对象。
在尝试使用纹理进行渲染之前,在glBindTexture( GL_TEXTURE_2D, tex )
之后添加glGenTextures()
次调用。
答案 2 :(得分:0)
好的,我找到了问题的答案。 :P
我必须在“Debug”文件夹中启动应用程序,而不是使用VC ++调试它。
唯一的问题是,现在加载的图片是颠倒的,但我想我可以在更改for循环时修复它。
感谢所有答案!