C ++ SOIL不加载小图像

问题描述 投票:3回答:2

我尝试使用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);
c++ opengl graphics textures soil
2个回答
5
投票

当图像加载到纹理对象时,GL_UNPACK_ALIGNMENT必须设置为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整除。


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(…);
© www.soinside.com 2019 - 2024. All rights reserved.