如何阻止pyglet图形库中图形的颜色混合效果?
解决Pyglet半透明矩形重叠颜色叠加问题
问题原因
Pyglet的shapes模块默认使用GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA混合模式,导致半透明形状重叠时颜色叠加变深。你之前调用的全局GL混合命令无效,是因为每个Shape对象在渲染时会自行设置混合状态,覆盖全局参数。
解决方案
方案1:修改Shape的混合函数
使用GL_SRC_ALPHA_SATURATE, GL_ONE混合模式,该模式会让重叠区域颜色不会叠加,保持与单个矩形一致的半透明度:
import pyglet from pyglet.gl import GL_SRC_ALPHA_SATURATE, GL_ONE window = pyglet.window.Window(fullscreen=True) batch = pyglet.graphics.Batch() rectangle1 = pyglet.shapes.Rectangle(100, 100, 80, 80, color=(128, 0, 0, 128), batch=batch) rectangle2 = pyglet.shapes.Rectangle(150, 150, 80, 80, color=(128, 0, 0, 128), batch=batch) # 为每个矩形设置自定义混合函数 rectangle1.blend_func = (GL_SRC_ALPHA_SATURATE, GL_ONE) rectangle2.blend_func = (GL_SRC_ALPHA_SATURATE, GL_ONE) @window.event def on_draw(): window.clear() batch.draw() pyglet.app.run()
方案2:合并为单个复合形状
既然两个矩形颜色完全一致,直接将它们合并成一个绘制对象,从根源避免重叠叠加问题:
import pyglet window = pyglet.window.Window(fullscreen=True) batch = pyglet.graphics.Batch() # 创建包含两个矩形的复合路径 path = pyglet.shapes.Path( [ # 第一个矩形(闭合路径) (100, 100), (180, 100), (180, 180), (100, 180), (100, 100), # 第二个矩形(闭合路径) (150, 150), (230, 150), (230, 230), (150, 230), (150, 150) ], batch=batch ) path.fill_color = (128, 0, 0, 128) @window.event def on_draw(): window.clear() batch.draw() pyglet.app.run()
方案3:启用深度测试避免重复绘制
开启深度测试后,后绘制的矩形不会覆盖已有区域(z坐标默认相同),重叠区域仅显示第一个矩形的颜色:
import pyglet from pyglet.gl import glEnable, GL_DEPTH_TEST, glDepthFunc, GL_LEQUAL, glDisable window = pyglet.window.Window(fullscreen=True) batch = pyglet.graphics.Batch() rectangle1 = pyglet.shapes.Rectangle(100, 100, 80, 80, color=(128, 0, 0, 128), batch=batch) rectangle2 = pyglet.shapes.Rectangle(150, 150, 80, 80, color=(128, 0, 0, 128), batch=batch) @window.event def on_draw(): window.clear() glEnable(GL_DEPTH_TEST) glDepthFunc(GL_LEQUAL) # z值相等时不覆盖已绘制内容 batch.draw() glDisable(GL_DEPTH_TEST) pyglet.app.run()
内容的提问来源于stack exchange,提问作者pyBro
相关产品推荐
相关产品推荐

