Python 如何在pyglet/pyopengl中使用透明层而不是纯色来清除屏幕

Python 如何在pyglet/pyopengl中使用透明层而不是纯色来清除屏幕,python,opengl,transparency,pyglet,pyopengl,Python,Opengl,Transparency,Pyglet,Pyopengl,我是pyglet的新手,我正在尝试画一个可以移动的物体。我想显示这个物体的轨迹,但要使旧的位置逐渐消失。因此,我试图用半透明的颜色来清除每一张画的屏幕 但是,由于某些原因,窗口清除方法是不透明的,即使我将颜色设置为几乎透明。如果我省略clear并绘制一个与窗口一样大的半透明正方形,代码就可以工作,但我不明白clear方法为什么会生成纯色 这是我的代码: 导入pyglet 类GameWindow(pyglet.window.window): 定义初始化(self,*args,**kwargs):

我是pyglet的新手,我正在尝试画一个可以移动的物体。我想显示这个物体的轨迹,但要使旧的位置逐渐消失。因此,我试图用半透明的颜色来清除每一张画的屏幕

但是,由于某些原因,窗口清除方法是不透明的,即使我将颜色设置为几乎透明。如果我省略clear并绘制一个与窗口一样大的半透明正方形,代码就可以工作,但我不明白clear方法为什么会生成纯色

这是我的代码:

导入pyglet 类GameWindow(pyglet.window.window): 定义初始化(self,*args,**kwargs): super() self.px,self.py=10,10 self.vx,self.vy=15,60 self.ax,self.ay=0,-5 def更新(自我,dt): self.px,self.py=self.px+self.vx*dt,self.py+self.vy*dt self.vx,self.vy=self.vx+self.ax*dt,self.vy+self.ay*dt def on_牵引(自): #带半透明层的透明屏幕 pyglet.gl.glEnable(pyglet.gl.gl\u混合) pyglet.gl.glBlendFunc(pyglet.gl.gl_SRC_ALPHA,pyglet.gl.gl_ONE_减去SRC_ALPHA) pyglet.gl.glClearColor(0,0,0,0.01)#黑色且几乎透明 self.clear() #计算并绘制对象 相对_顶点=[[20,20],[20,-20],-20,-20],-20,20]] 顶点=[] 对于相对_顶点中的v: 顶点.append(self.px+v[0]) 顶点.append(self.py+v[1]) 颜色=[255,0,0]*len(相对顶点) pyglet.graphics.vertex_列表(len(相对_顶点),(“v2f”,顶点),(“c3B”,颜色)).draw(pyglet.gl.gl_多边形) 如果名称=“\uuuuu main\uuuuuuuu”: config=pyglet.gl.config(双缓冲区=False) window=GameWindow(400400,config=config) pyglet.clock.schedule\u间隔(window.update,1/120) pyglet.app.run()文件 出于某种原因,我可以绘制透明对象,但使用“清除”时背景是不透明的。为什么这不起作用


另外,我想知道是否有一种方法可以使所有背景像素保持其颜色更加透明,而不必在其上绘制半透明的黑色层。

PyGlet是一种OpenGL包装器。清晰的方法使用
glClear
只将当前清除颜色(由设置)复制到颜色平面(当前帧缓冲区)的所有像素。没有任何东西与此操作混合

您必须在整个窗口上混合一个矩形,而不是使用“清除”:

#pyglet.gl.glClearColor(0,0,0,0.01)#
# subtract [1, 1, 1, 0] from all pixels in the frambuffer
        pyglet.gl.glEnable(pyglet.gl.GL_BLEND)
        pyglet.gl.glBlendEquation(pyglet.gl.GL_FUNC_REVERSE_SUBTRACT)
        pyglet.gl.glBlendFunc(pyglet.gl.GL_ONE, pyglet.gl.GL_ONE)
        cover_vertices = [0, 0, 400, 0, 400, 400, 0, 400]
        cover_colors = [1, 1, 1, 0] * (len(cover_vertices)//2)
        pyglet.graphics.vertex_list(len(cover_vertices)//2, ("v2f", cover_vertices), ("c4B", cover_colors)).draw(pyglet.gl.GL_POLYGON)

        # draw the object on top of the frambuffer
        pyglet.gl.glDisable(pyglet.gl.GL_BLEND)
        relative_vertices = [[20, 20], [20, -20], [-20, -20], [-20, 20]]
        vertices = []
        for v in relative_vertices:
            vertices.append(self.px + v[0])
            vertices.append(self.py + v[1])
        colors = [255, 0, 0] * len(relative_vertices)
        pyglet.graphics.vertex_list(len(relative_vertices), ("v2f", vertices), ("c3B", colors)).draw(pyglet.gl.GL_POLYGON)