GlDrawArrays только обновляется, когда я выхожу

freddie V. спросил: 28 марта 2018 в 02:24 в: python-3.x

У меня есть этот код в python3, который не работает на машинах Windows, но он работал на Linux-машине. Я рисую зеленый экран и красный треугольник, но красный треугольник появляется только при выходе.

import pygame
import numpyimport OpenGL.GL as gl
import OpenGL.GL.shaders as shaders
from pygame.rect import RectRED = (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 objectvertex_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 objectvertex_array_object = gl.glGenVertexArrays(1)
gl.glBindVertexArray(vertex_array_object)# shadersposition = 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()

Любые идеи относительно того, что может произойти?

Ive попробовав использовать display.update, отключив текстуры, вычерчивая за пределами цикла, удалив for, используя pygame.time.wait, линии рисования вместо треугольника.

1 ответ

Есть решение
Rabbid76 ответил: 28 марта 2018 в 02:48

Я рисую зеленый экран и красный треугольник, но красный треугольник появляется только при выходе из него.

Если режим отображения pygame.OPENGL, то pygame.display.flip() выполняет замену буфера gl.


Существует 2 возможных решения этой проблемы:

Eiter, вам нужно установить pygame.DOUBLEBUF режим отображения тоже (см. pygame.display.set_mode()):

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


Или, если вы не хотите использовать двойную буферизацию, тогда у вас есть чтобы принудительно выполнить команды GL вручную, с помощью glFlush():

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)    gl.glFlush() # force the execution of GL commands 
freddie V. ответил: 28 марта 2018 в 02:55
только что проверил и они работали, спасибо