Pop*_*viu 3 c++ opengl graphics textures soil
尝试使用SOIL为像素艺术游戏加载较小的纹理时遇到一些问题。这是加载40 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);
Run Code Online (Sandbox Code Playgroud)
将图像加载到纹理对象时,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);
Run Code Online (Sandbox Code Playgroud)
请注意,默认情况下该参数为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(…);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
82 次 |
| 最近记录: |