【问题标题】:C++ SOIL does not load small imagesC++ SOIL 不加载小图像
【发布时间】:2019-03-17 15:08:35
【问题描述】:

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

但是当我切换到 30 x 40 时:

当宽度小于高度时,我检查了我的代码是否有任何问题,对于 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);

【问题讨论】:

  • 如果用SOIL_save_image保存图片并在windows中打开,是否正确?小方形图片和大矩形图片会怎样?
  • 还有 OpenGL 失败了吗?检查glError,如果到目前为止一切正常,那么您将如何绘制它?
  • 我从未尝试保存,但我尝试过,但在这两种情况下我都没有得到任何文件:unsigned char* image = SOIL_load_image(("App/Textures/" + name + ".png").c_str(), &width, &height, 0, SOIL_LOAD_RGB); SOIL_save_image("test.bmp", SOIL_SAVE_TYPE_BMP, width, height, 0, image);
  • 我也没有收到任何 OpenGL 错误。
  • 保存时,把3作为第三个参数——通道数。加载时可以写0,因为它是由第四个参数设置的。

标签: c++ opengl graphics textures soil


【解决方案1】:

当图像加载到纹理对象时,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 整除。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • @PopescuFlaviu:这不是比赛 :-)
    猜你喜欢
    • 2019-05-19
    • 2019-08-25
    • 2020-02-15
    • 2023-03-15
    • 2018-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-05
    相关资源
    最近更新 更多