Python 将纹理加载到对象时的图像分色效果

Python 将纹理加载到对象时的图像分色效果,python,opengl,python-imaging-library,textures,pyopengl,Python,Opengl,Python Imaging Library,Textures,Pyopengl,这个问题我已经有一段时间了,我也忽略了它,但在这一点上,它不会消失的事实让我意识到这是一个真正的问题。每当我将图像加载到对象上时,颜色都会分成如下条带: 这是我正在使用的图像: 我不完全确定这是否正确,但我注意到这似乎只发生在复杂的图像上。当我有一个单一颜色的图像时,效果很好,但纹理和照片似乎永远都不起作用。另外,请注意,我尝试将原始图像转换为不同的文件类型,以查看这是否有帮助,并且结果没有差异 我用于加载图像的函数: def load_image(filename): im =

这个问题我已经有一段时间了,我也忽略了它,但在这一点上,它不会消失的事实让我意识到这是一个真正的问题。每当我将图像加载到对象上时,颜色都会分成如下条带:


这是我正在使用的图像:


我不完全确定这是否正确,但我注意到这似乎只发生在复杂的图像上。当我有一个单一颜色的图像时,效果很好,但纹理和照片似乎永远都不起作用。另外,请注意,我尝试将原始图像转换为不同的文件类型,以查看这是否有帮助,并且结果没有差异

我用于加载图像的函数:

def load_image(filename):
    im = Image.open(filename)
    return im

def get_texture_data(mode, im):
    if mode == "RGB":
        data = im.tobytes("raw", "RGBX", 0, -1)
    elif mode == "RGBA":
        data = im.tobytes("raw", "RGBA", 0, -1)
    return data
以及如何加载纹理:

texture = glGenTextures(1)
glBindTexture(GL_TEXTURE_2D, texture)

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT)
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT)

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR)
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR)

tex = load_image(file)
mode = "".join(Image.Image.getbands(tex))
if mode == "RGB":
    data = get_texture_data("RGB", tex)
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, tex.width, tex.height, 0, GL_RGB, GL_UNSIGNED_BYTE, data)
    glGenerateMipmap(GL_TEXTURE_2D)
else:
    data = get_texture_data("RGBA", tex)
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, tex.width, tex.height, 0, GL_RGBA, GL_UNSIGNED_BYTE, data)
    glGenerateMipmap(GL_TEXTURE_2D)
del data, tex
number = len(self.textures)
r = Texture(texture, number)
self.textures.append(r)
return r
请注意,使用的“Texture”类只是一个简单的类,它存储了纹理id和编号,以便于访问

编辑:我也可以使用我在绘画或GIMP中从头开始制作的图像。即使它们是更复杂的图像

该测试仪的工作原理如下:



当位图以“RGB”模式解码时,每个像素的大小仍为4字节,但alpha通道未定义(“RGBX”)。
使用
GL_RGBA
格式和
GL_RGB
纹理图像的内部目标格式来处理:

if mode==“RGB”:
数据=获取纹理数据(“RGB”,tex)
GLTEXAGE2D(GL_纹理_2D,0,GL_RGB,tex.width,tex.height,0,GL_RGBA,GL_无符号字节,数据)
# [...]

当我向图像添加alpha通道时,它可以工作,但我似乎仍然无法使它与原始图像在代码中工作。宽度为512,有3个通道,但将对齐设置为1或任何其他有效值似乎不起作用。