【问题标题】:PyOpenGL multitexture error - invalid operationPyOpenGL 多纹理错误 - 无效操作
【发布时间】:2014-12-25 20:23:46
【问题描述】:

我正在尝试在 python 3 中制作一个使用 pygame 和 OpenGL 的游戏,但我一直收到同样的错误:

OpenGL.error.GLError: GLError(
    err = 1282,
    description = b'invalid operation',
    baseOperation = glClear,
    cArguments = (16640,)
)

这是我的代码:

A 部分 - 创建和配置

Surface = pygame.display.set_mode((WIDTH, HEIGHT),  pygame.OPENGL)

glViewport(0, 0, WIDTH, HEIGHT)
glMatrixMode(GL_PROJECTION)
glLoadIdentity()
gluOrtho2D(-8.0, 8.0, -6.0, 6.0)
glMatrixMode(GL_MODELVIEW)
glLoadIdentity()

glShadeModel(GL_SMOOTH)
glClearColor(0.0, 0.0, 0.0, 0.0)
glClearDepth(1.0)
glDisable(GL_DEPTH_TEST)
glDisable(GL_LIGHTING)
glDepthFunc(GL_LEQUAL)
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST)
glEnable(GL_BLEND)

B 部分 - 创建纹理

class Texture():
    # simple texture class
    # designed for 32 bit png images (with alpha channel)
    def __init__(self,fileName):
        self.texID=0
        self.LoadTexture(fileName)

    def LoadTexture(self,fileName): 
        try:
            textureSurface = pygame.image.load(fileName).convert_alpha()
            textureData = pygame.image.tostring(textureSurface, "RGBA", True)

            self.w, self.h = textureSurface.get_size()

            self.texID=glGenTextures(1)

            glBindTexture(GL_TEXTURE_2D, self.texID)
            glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR)
            glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR)
            glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, textureSurface.get_width(), 
                         textureSurface.get_height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, 
                         textureData )

        except Exception as E:
            print(E)
            print ("can't open the texture: %s"%(fileName))

    def __del__(self):
        glDeleteTextures(self.texID)

    def get_width(self):
        return self.w

    def get_height(self):
        return self.h

C 部分 - 准备屏幕

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
glLoadIdentity()
glDisable(GL_LIGHTING)
glEnable(GL_TEXTURE_2D)
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)

D 部分 - 添加纹理

def blit(texture, x, y):
    glPushMatrix()
    glTranslatef(x, y, 0.0)
    glBindTexture(GL_TEXTURE_2D, texture.texID)

我查了一下,显然 PyOpenGL 3 在尝试渲染多个纹理时有这个未修复的错误。我使用 python 3.3,不想降级到 2.x,我找不到适用于 python 3 的 OpenGL 2。这个 bug 有办法解决吗?我是不是做错了什么?

【问题讨论】:

  • 它说它发生在“glClear”,所以我假设你还没有创建 OpenGL 上下文,在你调用 OpenGL 之前你需要这样做
  • 代码实际上是按执行顺序排列的,所以在 PART A 中我定义了 openGL 上下文

标签: python opengl python-3.x pygame pyopengl


【解决方案1】:

OpenGL Context 是线程本地的。如果您尝试从另一个线程调用 OpenGL 语句而不将当前 OpenGL 上下文设为当前,您将收到 INVALID_OPERATION 错误。
不幸的是,PyGame 没有提供使 OpenGL 上下文显式当前的函数。

另一种可能性是您错过了在某处关闭glBegin/glEndsequence withglEnd`。

【讨论】:

    猜你喜欢
    • 2015-09-28
    • 2018-08-24
    • 2021-10-02
    • 1970-01-01
    • 2021-09-18
    • 1970-01-01
    • 2018-09-16
    • 2011-10-25
    • 2014-10-23
    相关资源
    最近更新 更多