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)
这是纹理设置。
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)