如何解决为什么我在 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 举报,一经查实,本站将立刻删除。