Python glDrawArrays仅在退出时更新

Python glDrawArrays仅在退出时更新,python,python-3.x,opengl,pygame,Python,Python 3.x,Opengl,Pygame,我在python3中有这段代码,它在windows机器上不工作,但在linux机器上工作。我画了一个绿色屏幕和一个红色三角形,但红色三角形只在我退出时出现 import pygame import numpy import OpenGL.GL as gl import OpenGL.GL.shaders as shaders from pygame.rect import Rect RED = (255, 0, 0) WHITE = (255, 255, 255) pygame.init()

我在python3中有这段代码,它在windows机器上不工作,但在linux机器上工作。我画了一个绿色屏幕和一个红色三角形,但红色三角形只在我退出时出现

import pygame
import numpy

import OpenGL.GL as gl
import OpenGL.GL.shaders as shaders
from pygame.rect import Rect

RED = (255, 0, 0)
WHITE = (255, 255, 255)
pygame.init()

screen = pygame.display.set_mode((800, 600), pygame.OPENGL)

vertes_shader = """
#version 330
in vec4 position;

void main()
{
    gl_Position = position;
}
"""

fragment_shader = """
#version 330
void main()
{
    gl_FragColor = vec4(1.0f, 0.0f, 0.0f, 1.0f);
}
"""

shader = shaders.compileProgram(
    shaders.compileShader(vertes_shader, gl.GL_VERTEX_SHADER),
    shaders.compileShader(fragment_shader, gl.GL_FRAGMENT_SHADER)
)

vertes_data = numpy.array([
    0.0, 0.5, 0.0,
    0.5, -0.5, 0.0,
    -0.5, -0.5, 0.0
], dtype=numpy.float32)

# vrtex buffer object

vertex_buffer_object = gl.glGenBuffers(1)
gl.glBindBuffer(gl.GL_ARRAY_BUFFER, vertex_buffer_object)
gl.glBufferData(gl.GL_ARRAY_BUFFER, 36, vertes_data, gl.GL_STATIC_DRAW)

# vertex array object

vertex_array_object = gl.glGenVertexArrays(1)
gl.glBindVertexArray(vertex_array_object)

# shaders

position = gl.glGetAttribLocation(shader, 'position')
gl.glEnableVertexAttribArray(position)
gl.glVertexAttribPointer(position, 3, gl.GL_FLOAT, False, 0, None)


done = False
gl.glClearColor(0.5, 1.0, 0.5, 1.0)


while not done:
    for event in pygame.event.get():

        if event.type == pygame.QUIT:
            done = True

        if event.type == pygame.KEYUP and event.key == pygame.K_ESCAPE:
            done = True

    gl.glClear(gl.GL_COLOR_BUFFER_BIT)

    gl.glUseProgram(shader)

    gl.glDrawArrays(gl.GL_TRIANGLES, 0, 3)

    pygame.display.flip()
对可能发生的事情有什么想法吗

我尝试过使用
display.update
,禁用纹理,在循环外绘制,删除for,使用
pygame.time.wait
,绘制线条而不是三角形

我画了一个绿色屏幕和一个红色三角形,但红色三角形只在我退出时出现

如果显示模式为
pygame.OPENGL
,则执行GL缓冲区交换

您需要通过设置
pygame.DOUBLEBUF
显示模式标志来启用双缓冲(请参阅):

screen=pygame.display.set_模式((800600),pygame.OPENGL | pygame.DOUBLEBUF)
如果不想使用双缓冲,则必须通过以下方式手动强制执行GL命令:

run=True
运行时:
对于pygame.event.get()中的事件:
如果event.type==pygame.QUIT:
运行=错误
# [...]
gl.glFlush()#强制执行gl命令