PyOpenGL:glEnd 产生无效操作(错误 1282)

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

该程序应该使用 PyOpenGL 和旧版 OpenGL 接口绘制一些简单的几何图形,但会产生错误。我不明白它与 OpenGL API 有何冲突。这是代码:

import sys
sys.path.append("..\Blocks")
print sys.path
import pygame
from pygame.locals import *
from OpenGL.GL import *
from OpenGL.GLU import *

import random

try:
        import BlockModel
except:
        print "Cant Find Block Model"

def createBlock():  
        block = BlockModel.Block()

        blockVertices = block.returnVertices()

        blockEdges = block.returnEdges()
        
        blockSurface = block.returnSurface()
        
        glBegin(GL_QUADS)
        
        for surface in blockSurface:
                for faceVertex in surface:
                        glVertex3fv(blockVertices[faceVertex])
        
        glEnd
        
        glBegin(GL_LINES)
        for edge in blockEdges:
                for vertex in edge:
                        glVertex3fv(blockVertices[vertex])
        glEnd()

def main():
        pygame.init()
        display = (800, 600)
        pygame.display.set_mode(display, DOUBLEBUF|OPENGL)
        gluPerspective(15, (display[0]/display[1]), 0.1, 50.0)
        
        glTranslatef(random.randrange(-5,5),random.randrange(-5,5), -40)
        
        exit = False
        
        while not exit:
                pygame.time.wait(10)
                glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT)
                createBlock()
                pygame.display.flip()
                for event in pygame.event.get():
                        if event.type == pygame.QUIT:
                                pygame.quit()
                                quit()
                
                
main()

尝试运行程序时出现此错误:

C:\Users\Haavard\Desktop\MinecraftPythonProject\framework>python main.py
['C:\\Users\\Haavard\\Desktop\\MinecraftPythonProject\\framework', 'C:\\Windows\
\system32\\python27.zip', 'C:\\Python27\\DLLs', 'C:\\Python27\\lib', 'C:\\Python
27\\lib\\plat-win', 'C:\\Python27\\lib\\lib-tk', 'C:\\Python27', 'C:\\Python27\\
lib\\site-packages', 'C:\\Python27\\lib\\site-packages\\PIL', '..\\Blocks']
Traceback (most recent call last):
  File "main.py", line 60, in <module>
    main()
  File "main.py", line 52, in main
    createBlock()
  File "main.py", line 37, in createBlock
    glEnd()
  File "latebind.pyx", line 44, in OpenGL_accelerate.latebind.Curry.__call__ (c:
\Users\mcfletch\OpenGL-dev\OpenGL-ctypes\OpenGL_accelerate\src\latebind.c:1201)
  File "C:\Python27\lib\site-packages\OpenGL\GL\exceptional.py", line 46, in glE
nd
    return baseFunction( )
  File "C:\Python27\lib\site-packages\OpenGL\platform\baseplatform.py", line 402
, in __call__
    return self( *args, **named )
  File "errorchecker.pyx", line 53, in OpenGL_accelerate.errorchecker._ErrorChec
ker.glCheckError (c:\Users\mcfletch\OpenGL-dev\OpenGL-ctypes\OpenGL_accelerate\s
rc\errorchecker.c:1218)
OpenGL.error.GLError: GLError(
        err = 1282,
        description = 'invalid operation',
        baseOperation = glEnd,
        cArguments = ()
)

我在 HP 计算机上运行 Windows 7。

块模型模块如下所示:

class Block:

    # initializing the basic functions of a block
    def __init__(self, blockID = "0", blockType = "stone", verticesCords = ((1,-1,-1),(1,1,-1),(-1,1,-1),(-1,-1,-1),(1,-1,1),(1,1,1),(-1,-1,1),(-1,1,1)), edges = ((0,1),(0,3),(0,4),(2,1),(2,3),(2,7),(6,3),(6,4),(6,7),(5,1),(5,4),(5,7)), surfaces = (((0,1,2,3),(3,2,7,6),(6,7,5,4),(4,5,1,0),(1,5,7,2),(4,0,3,6)))):
        # Block Placement
        self.PLACEMENT = verticesCords
        # Block identity in the world
        self.EDGES = edges
        self.SURFACE = surfaces
        self.BLOCKID = blockID
        # The block type
        self.BLOCKTYPE = blockType

    # A function letting the framework know its placement.
    def returnVertices(self):
        return self.PLACEMENT

    def returnEdges(self):
        return self.EDGES

    def returnSurface(self):
        return self.SURFACE

    # A function to make the block fetch its own texture.
    def defineTexture():
        pass
python pyopengl
4个回答
0
投票

您可能已经解决了这个问题,但我的猜测是您的边中可能有奇数个顶点。 glEnd() 上的 1282 错误仅意味着整个操作有问题。 GL_LINES 期望给出偶数个顶点,因为 GL_LINES 以成对的点来定义每个线段,而不是通过连续的点串来形成大折线。 仔细检查每条边都有两个点。


0
投票

问题是这个

glEnd

应该是对此函数的调用

glEnd()

请注意,实际错误是在

glEnd()
函数末尾调用
createBlock
时产生的。这是因为对
glBegin(GL_QUADS)
的调用现在由该调用对
glEnd()
的调用结束。在此期间,有一个对
glBegin(GL_LINES)
的调用,根据 文档,这是不允许的:

如果在

GL_INVALID_OPERATION

 和相应的 
glBegin
 执行之间执行 
glBegin
,则会生成 
glEnd


让我们看看其他答案,首先是用户 1961169(2015 年 7 月 21 日)的答案,他指出错误来自于尝试使用奇数个顶点绘制线条。这是不正确的,因为这应该“不会”产生错误。不完全指定的图元根本无法绘制。根据文档

不完整指定的直线、三角形、四边形和多边形不会被绘制。当提供的顶点太少而无法指定单个图元时,或者指定了不正确的多个顶点时,就会导致不完整的指定。不完整的原语将被忽略;其余的都画好了。

Shivam 的回答(2019 年 9 月 4 日)指出,括号应该从第 37 行的
glEnd()

removed(就在函数结束之前)。这显然是不正确的,因为这样

glEnd
函数都不会被调用。
TheEditedOne(2018 年 12 月 31 日)的答案首先正确识别了应该更正的行,然后说这是一个猜测,然后猜测应该调用“

glEnd(GL_LINES)

glEnd(GL_QUADS)
”。后者是不正确的,因为该函数的函数原型被指定为
glEnd( void )-> void


-1
投票
()

第 37 行删除

glEnd()
,代码应该可以正常工作。
    


-2
投票

希望这有帮助

© www.soinside.com 2019 - 2024. All rights reserved.