PyQt、PyOPENGL:当给一个区域添加纹理时,其他区域会失去颜色并变成白色

PyQt, PyOPENGL: when adding a texture to an area, then other area lost their color and become white

这是纹理设置。

    img1 = Image.open(".\pictures\checkboard.jpg")
    img1_data = np.array(list(img1.getdata()), np.int8)
    glGenTextures(2)
    glBindTexture(GL_TEXTURE_2D, 2)
    glPixelStorei(GL_UNPACK_ALIGNMENT, 1)
    glTexImage2D(GL_TEXTURE_2D, 0, 3, img1.size[0], img1.size[1], 0, GL_RGB, GL_UNSIGNED_BYTE, img1_data)
    # glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP)
    # glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP)
    # 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_MAG_FILTER, GL_NEAREST)
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST)
    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL)

当我将这个纹理添加到一个区域时,底部区域变成了白色。太奇怪了,因为我的底部区域设置为红色 程序。

    glColor3f(1, 0, 0)
    glBegin(GL_QUADS)
    glVertex3f(-0.1, 0.1, 0)
    glVertex3f(-0.1, -0.1, 0)
    glVertex3f(0.1, -0.1, 0)
    glVertex3f(0.1, 0.1, 0)
    glEnd()

默认情况下纹理的颜色乘以当前颜色,因为默认情况下纹理环境模式(GL_TEXTURE_ENV_MODE)是GL_MODULATE。参见 glTexEnv

当环境模式更改为 GL_DECAL 时,颜色和纹理会根据纹理的 alpha 通道进行混合。
mixin可以表示为

final_color = color * (1 - texture_color.a) + texture_color *⁢ texture_color.a

final_color = mix(color, texture_color, texture_color.a)

如果你画一个四边形,没有设置任何纹理坐标,它们所有的纹理坐标都是相同的,并且具有最后由 glTexCoord 设置的值。
因为你得到了一个white四边形,看起来纹理坐标位置的纹素是完全白色的,alpha通道为1(或者纹理没有alpha通道,所以默认为 1)。

您必须先禁用纹理,然后才能绘制四边形来解决您的问题。见 glEnable:

glDisable(GL_TEXTURE_2D)
glColor3f(1, 0, 0)
glBegin(GL_QUADS)
glVertex3f(-0.1, 0.1, 0)
glVertex3f(-0.1, -0.1, 0)
glVertex3f(0.1, -0.1, 0)
glVertex3f(0.1, 0.1, 0)
glEnd()
glEnable(GL_TEXTURE_2D)