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, array([0], 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, 0, Z,
    X, 0, Z,
    -X, 0, -Z,
    X, 0, -Z,
    0, Z, X,
    0, Z, -X,
    0, -Z, X,
    0, -Z, -X,
    Z, X, 0,
    -Z, X, 0,
    Z, -X, 0,
    -Z, -X, 0], dtype='float32')

triangles = numpy.array(
    [0,4,1,
     0,9,4,
     9,5,4,
     4,5,8,
     4,8,1,
     8,10,1,
     8,3,10,
     5,3,8,
     5,2,3,
     2,7,3,
     7,10,3,
     7,6,10,
     7,11,6,
     11,0,6,
     0,1,6,
     6,1,10,
     9,0,11,
     9,11,2,
     9,2,5,
     7,2,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, 3, GL_FLOAT, GL_FALSE, 0, 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 上下文。所以这不是问题。我希望这里有人能告诉我我做错了什么。

4

0 回答 0