C++ C++;“土壤”不会加载小图像

C++ C++;“土壤”不会加载小图像,c++,opengl,graphics,textures,soil,C++,Opengl,Graphics,Textures,Soil,我在尝试使用SOIL为像素艺术游戏加载更小的纹理时遇到了一些问题。这是加载40 x 40图像时的结果: 但当我切换到30 x 40时: 当宽度小于高度时,我检查了我的代码是否有任何问题,对于40x50,一切都正常。我用Windows的图像查看器检查了30x40,看起来也不错。使用坐标轴设置位置时,可能会以任何方式影响装载机的一件事,但是,它工作正常。这是加载纹理的代码: glGenTextures(1, &actor.texture); glBindTexture(GL_TEXT

我在尝试使用SOIL为像素艺术游戏加载更小的纹理时遇到了一些问题。这是加载40 x 40图像时的结果:

但当我切换到30 x 40时:

当宽度小于高度时,我检查了我的代码是否有任何问题,对于40x50,一切都正常。我用Windows的图像查看器检查了30x40,看起来也不错。使用坐标轴设置位置时,可能会以任何方式影响装载机的一件事,但是,它工作正常。这是加载纹理的代码:

glGenTextures(1, &actor.texture);
glBindTexture(GL_TEXTURE_2D, actor.texture);
unsigned char* image = SOIL_load_image(("App/Textures/" + name + ".png").c_str(), &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_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

将图像加载到纹理对象时,必须将其设置为1:

glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, image); 
注意,默认情况下,参数为4。这意味着假设图像的每一行对齐到4的倍数。由于图像数据是紧密压缩的,每个像素的大小为3字节,因此必须更改对齐方式

当图像大小为40 x 50时,以字节为单位的行大小为120,可以被4整除。

但是,如果图像的大小是30 x 40,则以字节为单位的行的大小是90,不能被4整除

问题不在于尺寸太小,而是30不能被4整除:
30=2*3*5
。OpenGL的默认像素存储设置假定行与4字节边界对齐。对于40×40的图像,这个条件正好满足,因为无论使用什么像素格式,宽度都有一个因子4

解决方案是告诉OpenGL,像素行从不同的n字节边界开始:

unsigned char* image = SOIL_load_image(…);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glTexImage2D(…);

如果使用
SOIL\u save\u image
保存图像并在windows中打开,是否正确?小正方形图像和大矩形图像会怎么样?OpenGL也会失败吗?检查
glError
,如果到目前为止一切正常,那么如何绘制呢?我从未尝试过保存,但我尝试过,在这两种情况下都没有得到任何文件:
unsigned char*image=SOIL\u load\u image(((((“App/Textures/“+name+”.png”).c\u str(),&width,&height,0,SOIL\u load\u RGB);土壤保存图像(“test.bmp”,土壤保存类型,宽度,高度,0,图像)我也没有OpenGL错误。保存时,将3作为第三个参数-通道数。您可以在加载时写入0,因为它是由第四个参数设置的。@PopescuFlaviu:这里不是竞赛:-)