PyOpenGL - 调用 glEnd 给出 OpenGL 错误 1282

问题描述 投票:0回答:1

尝试遵循 本教程 对于 PyOpenGL,我在调用 glEnd() 时会收到 OpenGL 错误 1282。

这是我的代码

import OpenGL
import OpenGL.GL
from OpenGL.GLUT import *
import OpenGL.GLU
from OpenGL.raw.GL.VERSION.GL_1_1 import *
import time

def square():
    glBegin(GL_QUADS)
    glVertex2f(100,100)
    glVertex2f(200,100)
    glVertex2f(200, 200)
    glVertex2f(100, 200)
    glEnd()


def iterate():
    glViewport(0, 0, 500,500)
    glMatrixMode(GL_PROJECTION)
    glLoadIdentity()
    glOrtho(0.0, 500, 0.0, 500, 0.0, 1.0)
    glMatrixMode (GL_MODELVIEW)
    glLoadIdentity()

def showScreen():
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
    glLoadIdentity()
    iterate()
    glColor3f(1.0, 0.0, 3.0)
    square()
    glutSwapBuffers()
    time.sleep(0.017)

glutInit()
glutInitDisplayMode(GLUT_RGBA)
glutInitWindowSize(500,500)
glutInitWindowPosition(0, 0)
wind = glutCreateWindow(b'OpenGL Coding Practice')
glutDisplayFunc(showScreen)
glutIdleFunc(showScreen)
glutMainLoop()

这是我的要求.txt

numpy==2.1.2
PyOpenGl==3.1.7

终端显示如下:

Traceback (most recent call last):
  File "C:\Users\foo\OPENGLProject\.venv\Lib\site-packages\OpenGL\GLUT\special.py", line 130, in safeCall
    return function( *args, **named )
           ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\foo\OPENGLProject\src\main.py", line 37, in showScreen
    square()
  File "C:\Users\foo\OPENGLProject\src\main.py", line 14, in square
    glEnd()
  File "C:\Users\foo\OPENGLProject\.venv\Lib\site-packages\OpenGL\platform\baseplatform.py", line 415, in __call__
    return self( *args, **named )
           ^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\foo\OPENGLProject\.venv\Lib\site-packages\OpenGL\error.py", line 230, in glCheckError
    raise self._errorClass(
OpenGL.error.GLError: GLError(
    err = 1282,
    description = b'operaci\xf3n no v\xe1lida',
    baseOperation = glEnd,
    cArguments = ()
)
GLUT Display callback <function showScreen at 0x000002BB62CCFEC0> with (),{} failed: returning None GLError(
    err = 1282,
    description = b'operaci\xf3n no v\xe1lida',
    baseOperation = glEnd,
    cArguments = ()
)

我在 venv 中使用 Windows 10 和 Python 3.12.3

这可能是什么原因造成的?

作为可能有帮助的附加说明:我必须手动安装 freeglut.dll。我没有安装 PyOpenGL_accelerate 因为安装错误。

我还尝试将 glBegin 参数更改为 GL_LINES 和 GL_TRIANGLES,使用 glVertex 的其他方法,如 glVertex3f、glVeretx3d 或 glVertex3fv 并更改调用 glVertex 的次数;都给出相同的结果。

python opengl pyopengl
1个回答
0
投票

请注意,OpenGL 相关的导入与教程中的导入不同。教程使用

from OpenGL.GL import *
from OpenGL.GLUT import *
from OpenGL.GLU import *

特别是,添加

import OpenGL
会导入 PyOpenGL 的默认错误检查机制,每次调用 OpenGL 库时都会调用
glCheckError
,并在发现错误时引发异常 (ref)。

在使用现代 OpenGL(通常版本 >=3.3,使用 VAO 和 VBO)时这很好,但在使用旧版界面时会遇到问题(

glBegin
glEnd
)。来自文档

如果是

GL_INVALID_OPERATION
glVertex
glColor
glSecondaryColor
glIndex
glNormal
glFogCoord
glTexCoord
glMultiTexCoord
 以外的命令,则会生成 
glVertexAttrib
glEvalCoord
glEvalPoint
glArrayElement
glMaterial
glEdgeFlag
glCallList
glCallLists
)在执行
glBegin
和相应执行
glEnd

之间执行。

问题是函数
glCheckError不在此列表中,并且可能无法在此处调用。因此,会出现“无效操作”错误(或者在您的语言中为 operación no válida

)。

解决此问题的一种方法自然是将问题代码中的导入替换为教程中的导入。

另一种方法是至少导入普通的

OpenGL
raw
版本。后者提供对 C 接口的访问,但目前没有必要。换句话说,保持:

import OpenGL.GL
from OpenGL.GLUT import *
import OpenGL.GLU

作为演示,也可以通过禁用默认的错误检查机制来消除错误。紫色四边形仍然会渲染:

import OpenGL
OpenGL.ERROR_CHECKING = False
import OpenGL.GL
from OpenGL.GLUT import *
import OpenGL.GLU
from OpenGL.raw.GL.VERSION.GL_1_1 import *
© www.soinside.com 2019 - 2024. All rights reserved.