我在YouTube上遵循"Pyglet Python and OpenGL - part 01 - Hello Triangle"的Attila Toth教程,用Pyglet绘制了三角形,因为我以前从未使用过Pyglet。据我所知,代码与视频中的代码相同,但是,当我移动鼠标时,图像会闪烁,但没有错误消息。
作为参考,我的计算机具有4 GB的RAM,i3 7020U和集成的图形,具有DirectX版本12。我使用的是Windows 10 build 18632。
代码:
import pyglet
from pyglet.gl import *
class Window(pyglet.window.Window):
def __init__(self, *args,**kwargs):
super().__init__(*args, **kwargs)
self.set_minimum_size(400, 300)
self.triangle = Triangle()
def ondraw(self):
self.triangle.vertices.draw(GL_TRIANGLES)
class Triangle():
def __init__(self):
self.vertices = pyglet.graphics.vertex_list(3, ('v3f', [-0.5,-0.5,0.0, 0.5,-0.5,0.0, 0.0,0.5,0.0]),
('c3B', [100,200,220, 200,110,100, 100,250,100]))
if __name__ == "__main__":
window = Window(800, 600, "The Game", resizable=True)
window.ondraw()
pyglet.app.run()
我无法重现该问题,我的机器上没有闪烁。 ((GTX 1070、6年前的i7和16GB的RAM,Windows 10等)>]
但是,您的代码存在一些小问题。例如,它是on_draw
而不是ondraw
,这将在以后变得很重要,因为它是pyglet.window.Window.on_draw函数的挂钩替代,在某些事件下会被调用。
这里的另一个重要功能是设置glViewport
,否则屏幕上将不会显示任何内容。因此,您需要的最少代码是:
import pyglet from pyglet.gl import * class Window(pyglet.window.Window): def __init__(self, *args,**kwargs): super().__init__(*args, **kwargs) self.set_minimum_size(400, 300) self.triangle = Triangle() def on_draw(self): self.clear() self.triangle.vertices.draw(GL_TRIANGLES) def on_resize(self, width, height): glViewport(0, 0, width, height) class Triangle(): def __init__(self): self.vertices = pyglet.graphics.vertex_list(3, ('v3f', [-0.5,-0.5,0.0, 0.5,-0.5,0.0, 0.0,0.5,0.0]), ('c3B', [100,200,220, 200,110,100, 100,250,100])) if __name__ == "__main__": window = Window(800, 600, "The Game", resizable=True) pyglet.app.run()
了解
on_***
事件是由Pyglet的内部机制触发的,而不是您应该手动调用的东西非常重要(就像您通过if __name__ ...
在window.ondraw()
中所做的那样,这不是一个好主意。
相反,如果要强制draw
事件,只需通过触发Pyglet事件来触发它,一些示例是:
闪烁可能来自您的图形卡(或缺少适当的驱动程序),它根本无法满足您所要求的刷新率。尝试快速击打[[空格键