将纹理加载到对象上时,PyOpenGL和PIL.Image分色效果。

问题描述 投票:0回答:1

我遇到这个问题已经有一段时间了,我也同样忽略了它,但此时,它不会消失的事实让我明白,这是一个真正的问题。每当我将图像加载到一个对象上时,颜色就会像这样分离成带状。

渲染中的颜色分离

这是我正在使用的图像。

图片应该是什么样子的

我不完全确定这是否正确,但我注意到这似乎只发生在具有复杂性的图像上。当我有一个单一颜色的图像时,它工作得很好,但纹理和照片似乎永远不会工作。另外,请注意,我试过将原始图像转换为不同的文件类型,看看是否会有帮助,但结果没有区别。

我正在使用的加载图像的函数。

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和编号,以方便访问。

EDIT:我也可以使用我在Paint或GIMP中从头开始制作的图像。即使它们是比较复杂的图像。

这个测试的时候就可以正常使用了。

功能测试图像

python-imaging-library textures pyopengl
1个回答
1
投票

当位图以 "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)
    # [...]
© www.soinside.com 2019 - 2024. All rights reserved.