我在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
,禁用纹理,在循环外绘图,使用pygame.time.wait
删除for,绘制线而不是三角形。
答案 0 :(得分:3)
我绘制了一个绿色屏幕和一个红色三角形,但只有当我退出时才会出现红色三角形。
如果显示模式为pygame.OPENGL
,则pygame.display.flip()
执行gl缓冲区交换。
该问题有两种可能的解决方案:
Eiter你也必须设置pygame.DOUBLEBUF
显示模式(见pygame.display.set_mode()
):
screen = pygame.display.set_mode((800, 600), pygame.OPENGL | pygame.DOUBLEBUF)
或者,如果您不想使用双缓冲,则必须通过glFlush()
手动强制执行GL命令:
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