Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl 使用FreeImage加载图像_Opengl_2d_Freeimage - Fatal编程技术网

Opengl 使用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

我试图学习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);
//加载纹理
胶合特克斯;
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;