glDrawArrays 仅在我退出时更新 [英] glDrawArrays only updates when i exit

查看:90
本文介绍了glDrawArrays 仅在我退出时更新的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在 python3 中有这段代码,它在 windows 机器上不起作用,但在 linux 机器上运行.我画了一个绿屏和一个红色三角形,但红色三角形只有在我退出时才会出现.

I have this code in python3 which doesn't work on windows machines but it worked on a linux machine. I draw a green screen and a red triangle but the red triangle only appears when I exit.

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()

对可能发生的事情有什么想法吗?

Any ideas as to what could be happening?

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

Ive tried using display.update, disabling textures, drawing outside the loop, removing the for, using pygame.time.wait, drawing lines instead of triangle.

推荐答案

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

I draw a green screen and a red triangle but the red triangle only appears when i exit.

如果显示模式是pygame.OPENGLpygame.display.flip() 执行 GL 缓冲区交换.

If the display mode is pygame.OPENGL, pygame.display.flip() performs a GL buffer swap.

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

You need to enable double buffering by setting the pygame.DOUBLEBUF display mode flag (see pygame.display.set_mode()):

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

如果您不想使用双缓冲,则必须使用 glFlush():

If you do not want to use double buffering, you must force the execution of GL commands manually with glFlush():

run = True
while run:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False

    # [...]

    gl.glFlush() # force the execution of GL commands 

这篇关于glDrawArrays 仅在我退出时更新的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆