所以我很确定我在这里调用OpenG的方式做错了什么. 我在下面提供了一个例子,大约30%的情况下,它会在红色背景上显示半透明的顶部彩色方块.另外70%的情况下,它只显示红色背景.我try comments 各种opengl命令,看看是否可以让它可靠地工作.这是我从一个更大的程序中try "最低限度"可重复的例子.
我try 将z坐标添加到点并设置GL_DEPATH_SET,但没有什么区别,70%的情况下它仍然不起作用.
奇怪的是,有时它会处于程序每隔一次工作几次的状态,但也许这只是一个巧合.
此外,当它确实工作时,它工作得很好,并循环使用不同方块的所有 colored颜色 ,直到程序终止,所以这让我认为初始化或某种竞争条件或其他什么问题.
import OpenGL.GL as gl
import numpy as np
import pygame as pg
from pygame import locals as pg_locals
import time
class OpenGLWindow:
def __init__(self):
self.use_color_buffer = 0
flags = pg_locals.DOUBLEBUF | pg_locals.OPENGL | pg_locals.RESIZABLE
self.pg_window = pg.display.set_mode(
(800, 600),
flags,
vsync=1,
)
# gl.glTexEnvf(gl.GL_TEXTURE_ENV, gl.GL_TEXTURE_ENV_MODE, gl.GL_MODULATE)
# gl.glEnable(gl.GL_DEPTH_TEST) # we are disabling this for now because the texture z depth and overlay elements aren't configured right yet.
gl.glEnable(gl.GL_BLEND)
gl.glEnable(gl.GL_COLOR_MATERIAL)
gl.glColorMaterial(gl.GL_FRONT_AND_BACK, gl.GL_AMBIENT_AND_DIFFUSE)
gl.glBlendFunc(gl.GL_SRC_ALPHA, gl.GL_ONE_MINUS_SRC_ALPHA)
# gl.glEnable(gl.GL_TEXTURE_2D)
# gl.glLoadIdentity()
self.setup_buffers_2()
def setup_buffers_2(self):
self._vertexBuffer = gl.glGenBuffers(1)
self._colorBuffers = gl.glGenBuffers(3)
gl.glBindBuffer(gl.GL_ARRAY_BUFFER, self._vertexBuffer)
vertices = np.array(
[0.5, 0.5, 0, 0.5, 0, 0, 0.5, 0, -0.5, -0.5, 0, -0.5, 0, 0, -0.5, 0],
dtype="float32",
)
gl.glBufferData(gl.GL_ARRAY_BUFFER, vertices, gl.GL_STATIC_DRAW) # Error
for n in range(3):
gl.glBindBuffer(gl.GL_ARRAY_BUFFER, self._colorBuffers[n])
colors = []
for p in range(8):
for c in range(3):
colors.append((p % 4) * 0.25 if c == n else 0)
colors.append((p % 4) * 0.25)
print(colors)
gl.glBufferData(
gl.GL_ARRAY_BUFFER, np.array(colors, dtype="float32"), gl.GL_STATIC_DRAW
)
def cleanup_buffers_2(self):
gl.glBindBuffer(gl.GL_ARRAY_BUFFER, self._vertexBuffer)
gl.glDeleteBuffers(1, self._vertexBuffer)
gl.glBindBuffer(gl.GL_ARRAY_BUFFER, 0)
for n in range(3):
gl.glBindBuffer(gl.GL_ARRAY_BUFFER, self._colorBuffers[n])
gl.glDeleteBuffers(3, self._colorBuffers)
gl.glBindBuffer(gl.GL_ARRAY_BUFFER, 0)
def render_opengl_2(self):
gl.glClearColor(1.0, 0.0, 0.0, 1.0)
gl.glClear(gl.GL_COLOR_BUFFER_BIT | gl.GL_DEPTH_BUFFER_BIT)
gl.glEnableClientState(gl.GL_VERTEX_ARRAY)
gl.glEnableClientState(gl.GL_COLOR_ARRAY)
gl.glBindBuffer(gl.GL_ARRAY_BUFFER, self._vertexBuffer)
gl.glVertexPointer(2, gl.GL_FLOAT, 0, 0)
gl.glBindBuffer(gl.GL_ARRAY_BUFFER, self._colorBuffers[self.use_color_buffer])
gl.glColorPointer(4, gl.GL_FLOAT, 0, 0)
gl.glDrawArrays(gl.GL_QUADS, 0, 8)
pg.display.flip()
self.use_color_buffer += 1
self.use_color_buffer %= 3
window = OpenGLWindow()
# window.render_opengl_2()
# time.sleep(1)
# window.cleanup_buffers_2()
try:
for _ in range(30):
window.render_opengl_2()
time.sleep(0.1)
finally:
window.cleanup_buffers_2()