我正在尝试学习OpenGL教程,但是本教程使用的是土壤(这对我不起作用),我使用的是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);我的“解决方案”只会导致一个黑窗口(没有错误)。
发布于 2013-10-26 17:09:37
C中的编码是非常有趣的
你是程序员。您最好调试您的程序,因为OpenGL应用程序中的“黑色屏幕”可能是由无数不同的原因造成的。从我们的角度来看,我们只能猜测。我们也不喜欢。
我猜
(好吧,有时候我们喜欢猜测)
这是:
FIBITMAP* temp = imagen;
imagen = FreeImage_ConvertTo32Bits(imagen);
FreeImage_Unload(temp);您的temp和imagen指向相同的位置,所以FreeImage_Unload(temp);之后都指向.我们不知道在哪。然后你从它得到像素:
char* pixeles = (char*)FreeImage_GetBits(imagen);
它还能返回什么?我们不知道。在此之后,您不会检查pixels是否存在。不明确的行为等等。它甚至不会崩溃。而且,在相同的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循环。
发布于 2013-10-26 16:34:19
您似乎从未绑定您创建的纹理对象。
在glBindTexture( GL_TEXTURE_2D, tex )之后添加一个glGenTextures()调用,然后再添加一个使用纹理渲染的调用。
发布于 2013-10-27 13:43:22
好吧,我找到了我问题的答案。:P
我必须在"Debug“文件夹中启动应用程序,而不是用VC++调试它。
唯一的问题是,现在加载的图片是颠倒的,但我想,当我改变for循环时,我可以修复它。
谢谢你的回答!
https://stackoverflow.com/questions/19606736
复制相似问题