PyGlet - это оболочка OpenGL. Метод очистки использует glClear
. glClear
не делает ничего, кроме как скопировать текущий чистый цвет (который установлен glClearColor
) во все пиксели цветовой плоскости (текущего кадрового буфера). Ничто не смешивается с этими операциями.
Вы должны наложить прямоугольник на всё окно вместо использования clear:
# pyglet.gl.glClearColor(0, 0, 0, 0.01) # <--- delete
# self.clear() # <--- delete
cover_vertices = [0, 0, 400, 0, 400, 400, 0, 400]
cover_colors = [0, 0, 0, 2] * (len(cover_vertices)//2)
pyglet.graphics.vertex_list(len(cover_vertices)//2, ("v2f", cover_vertices), ("c4B", cover_colors)).draw(pyglet.gl.GL_POLYGON)
Есть ли способ сделать это лучше? Я уже пробовал это, но я не был доволен результатом. Я ожидал бы, что темно-красная траектория снова постепенно исчезнет в черном
В этом случае режим наложения должен быть изменен. Нарисуйте прямоугольник, который покрывает экран и вычитается из целевого цвета. Это может быть достигнуто путем установки параметра glBlendEquation
на GL_FUNC_REVERSE_SUBTRACT
.
Наконец, нарисуйте красный прямоугольник сверху с отключенным режимом наложения:
# 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)