为什么我在 PyOpenGL 中使用 glGenVertexArrays() 时会收到“无效操作错误”,即使我正在创建 OpenGL 4.1 上下文?

问题描述

我正在尝试编写一个简单的程序来使用 PyOpenGL 显示二十面体,但我无法通过生成 VAO。问题在 glGenVertexArrays Mac OSX PyOpenGL 中没有解决,因为我正在创建 OpenGL 4.1 上下文。我总是收到以下错误消息:

Traceback (most recent call last):
  File "/Users/bresslem/Documents/Uni/11.Semester/CG/Projekt/testBuffers.py",line 149,in <module>
    main()
  File "/Users/bresslem/Documents/Uni/11.Semester/CG/Projekt/testBuffers.py",line 106,in main
    VAO = glGenVertexArrays(1)
  File "src/latebind.pyx",line 39,in OpenGL_accelerate.latebind.LateBind.__call__
  File "src/wrapper.pyx",line 318,in OpenGL_accelerate.wrapper.Wrapper.__call__
  File "src/wrapper.pyx",line 311,in OpenGL_accelerate.wrapper.Wrapper.__call__
  File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/OpenGL/platform/baseplatform.py",line 415,in __call__
    return self( *args,**named )
  File "src/errorchecker.pyx",line 58,in OpenGL_accelerate.errorchecker._ErrorChecker.glCheckerror
OpenGL.error.GLError: GLError(
err = 1282,description = b'invalid operation',baSEOperation = glGenVertexArrays,pyArgs = (1,<object object at 0x7fddc4f63bc0>),cArgs = (1,array([0],dtype=uint32)),cArguments = (1,dtype=uint32)))

我的代码如下:

import pygame as pg
from pygame.locals import *

from OpenGL.GL import *
from OpenGL.glu import *
from OpenGL.gluT import *
from OpenGL.arrays import vbo

import numpy
import sys

vertexShaderSource = """#version 150
uniform mat4  cProjectionMatrix;
uniform mat4  cModelviewMatrix;

in vec4 in_Position;

void main()
{
  gl_Position = cProjectionMatrix * cModelviewMatrix * in_Position;
} """


fragmentShaderSource = """#version 150
out vec4 out_color;
void main()
{
  out_color = vec4( 1.0,0.0,1.0,1.0 );
}"""


X = 0.52573111212
Z = 0.85065080835

vertices = numpy.array(
    [-X,Z,X,-X,-Z,0],dtype='float32')

triangles = numpy.array(
    [0,4,1,9,5,8,10,3,2,7,6,11,11],dtype='int16')


def icosahedron():
    vertices_r = vertices.reshape((12,3))
    triangles_r = triangles.reshape((20,3))
    glBegin(GL_TRIANGLES)
    for triangle in triangles_r:
        for vertex in triangle:
            glVertex3fv(vertices_r[vertex])
    glEnd()

def main():
    pg.init()
    display = (1280,720)
    pg.display.gl_set_attribute(pg.GL_CONTEXT_MAJOR_VERSION,3)
    pg.display.gl_set_attribute(pg.GL_CONTEXT_MInor_VERSION,0)
    pg.display.gl_set_attribute(pg.GL_CONTEXT_PROFILE_MASK,pg.GL_CONTEXT_PROFILE_CORE)
    pg.display.set_mode(display,DOUBLEBUF|OPENGL)
    print(glGetString(GL_VERSION))

    gluPerspective(45,(display[0]/display[1]),0.1,50.0)

    VAO = glGenVertexArrays(1)
    glBindVertexArray(VAO)

    VBO = glGenBuffers(1)
    glBindBuffer(GL_ARRAY_BUFFER,VBO)
    glBufferData(GL_ARRAY_BUFFER,vertices,GL_DYNAMIC_DRAW)
    glVertexAttribPointer(0,GL_FLOAT,GL_FALSE,None)
    glEnabLevertexAttribArray(0)
    glBindVertexArray(0)

    EBO = glGenBuffers(1)
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,EBO)
    glBufferData(GL_ELEMENT_ARRAY_BUFFER,triangles,GL_DYNAMIC_DRAW)


    vertexShader = glCreateShader(GL_VERTEX_SHADER)
    glShaderSource(vertexShader,vertexShaderSource)
    glCompileShader(vertexShader)

    fragmentShader = glCreateShader(GL_FRAGMENT_SHADER)
    glShaderSource(fragmentShader,fragmentShaderSource)
    glCompileShader(fragmentShader)

    shaderProgram = glCreateProgram()
    glAttachShader(shaderProgram,vertexShader)
    glAttachShader(shaderProgram,fragmentShader)
    glLinkProgram(shaderProgram)


    while True:
        for event in pg.event.get():
            if event.type == pg.QUIT:
                pg.quit()
                quit()

        glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT)
        gluseProgram(shaderProgram)
        glBindVertexArray(VAO)
        glDrawElements(GL_TRIANGLES,12,GL_INT,0)
        pg.display.flip()
        pg.time.wait(10)

    glDeleteShader(vertexShader)
    glDeleteShader(fragmentShader)

if __name__ == "__main__":
    main()

我看不到 VAO = glGenVertexArrays(1) 行中可能发生错误的位置。据我所知,代码是非常标准的 PyOpenGL 代码。我在 macOS BigSur 11.1 上使用 Python 3.9.1。我正在创建一个 OpenGL4.1 上下文。所以这不是问题。 我希望这里有人能告诉我我做错了什么。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)