所以我很确定我在这里调用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()

推荐答案

glVertexPointer的最后一个参数是const GLvoid *类型.因此参数必须是Nonectypes.c_void_p(0),但不是0:

gl.glVertexPointer(2, gl.GL_FLOAT, 0, 0)

gl.glVertexPointer(2, gl.GL_FLOAT, 0, None)

glColorPointer也是如此.

Python相关问答推荐

如何将 map 数组组合到pyspark中每列的单个 map 中

调试回归无法解决我的问题

想要使用Polars groupby_Dynamic来缩减时间序列收件箱(包括空垃圾箱)

带有pandas的分区列上的过滤器的多个条件read_parquet

为什么我的(工作)代码(生成交互式情节)在将其放入函数中时不再工作?

如何观察cv2.erode()的中间过程?

如何在Python中增量更新DF

从 struct 类型创建MultiPolygon对象,并使用Polars列出[list[f64]列

如果AST请求默认受csref保护,那么在Django中使用@ system_decorator(csref_protect)的目的是什么?

替换字符串中的点/逗号,以便可以将其转换为浮动

如何使用Selenium访问svg对象内部的元素

为什么tkinter框架没有被隐藏?

Python中的嵌套Ruby哈希

在Python argparse包中添加formatter_class MetavarTypeHelpFormatter时, - help不再工作""""

启用/禁用shiny 的自动重新加载

如何更新pandas DataFrame上列标题的de值?

如何在FastAPI中为我上传的json文件提供索引ID?

以异步方式填充Pandas 数据帧

将链中的矩阵乘法应用于多组值

查看pandas字符列是否在字符串列中