PyOpenGL 和 PIL.Image 将纹理加载到对象上时的颜色分离效果

PyOpenGL and PIL.Image Color Separation Effect When Loading Textures Onto Objects

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

Color separation in render

这是我正在使用的图像:

What the image should look like

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

我用来加载图像的函数:

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" class 只是一个简单的 class,它存储纹理 ID 和编号以便于访问。

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

这个测试可以正常工作:

Functional Test Image

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

if mode == "RGB":
    data = get_texture_data("RGB", tex)
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, tex.width, tex.height, 0, GL_RGBA, GL_UNSIGNED_BYTE, data)
    # [...]