C ++ SOIL无法加载小图像

时间:2019-03-17 15:08:36

标签: c++ opengl graphics textures soil

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

enter image description here

但是当我切换到30 x 40时: enter image description here

enter image description here

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

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);

2 个答案:

答案 0 :(得分:5)

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

for (int i = 0; i < playarea.getChildCount(); i++) {
    View muecke = playarea.getChildAt(i);
    Date birthdate = getTheDateForThisViewFromSomewhere();
    muecke.setTag(R.id.birthDate, birthDate);
}

请注意,默认情况下该参数为4。这意味着假定图像的每一行对齐的大小都是4的倍数。由于图像数据被紧密打包,每个像素的大小为3字节,必须更改对齐方式。

当图像的大小为40 x 50时,以字节为单位的一行的大小为120,可被4整除。
但是,如果图像的大小为30 x 40,则一行的大小(以字节为单位)为90,不能被4整除。

答案 1 :(得分:5)

问题不在于尺寸小,而是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(…);