我一直在尝试让批处理工作在pyglet中,但我完全被来自pyglet/graphics/__init__.py
文件的错误消息“解压得太多”感到困惑。我的猜测是,在向批处理中添加几何时,我在语法上做错了。
我将代码缩减为产生错误的基本部分:
from pyglet.gl import *
from pyglet.graphics import *
import pyglet
batch = pyglet.graphics.Batch()
img = pyglet.image.load('pic.png')
texture = img.get_texture()
class TextureEnableGroup(pyglet.graphics.Group):
def set_state(self):
glEnable(GL_TEXTURE_2D)
def unset_state(self):
glDisable(GL_TEXTURE_2D)
texture_enable_group = TextureEnableGroup()
class TextureBindGroup(pyglet.graphics.Group):
def __init__(self, texture):
super(TextureBindGroup, self).__init__(parent=texture_enable_group)
self.texture = texture
def set_state(self):
glBindTexture(GL_TEXTURE_2D, self.texture.id)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR)
def __eq__(self, other):
return (self.__class__ is other.__class__ and self.texture == other.__class__)
batch.add(12, GL_TRIANGLES, TextureBindGroup(texture), (('t2f', (0, 0)), ('v3f', (64, 64, 0)), ('t2f', (1, 1)), ('v3f', (-64, -64, 205)), ('t2f', (0, 1)), ('v3f', (-64, 64, 205)), ('t2f', (1, 1)), ('v3f', (64, -64, 205)), ('t2f', (1, 0)), ('v3f', (64, 64, 0)), ('t2f', (0, 1)), ('v3f', (-64, -64, 205))))
答案 0 :(得分:1)
你的问题在这一行:
batch.add(12, GL_TRIANGLES, TextureBindGroup(texture), (('t2f', (0, 0)), ('v3f', (64, 64, 0)), ('t2f', (1, 1)), ('v3f', (-64, -64, 205)), ('t2f', (0, 1)), ('v3f', (-64, 64, 205)), ('t2f', (1, 1)), ('v3f', (64, -64, 205)), ('t2f', (1, 0)), ('v3f', (64, 64, 0)), ('t2f', (0, 1)), ('v3f', (-64, -64, 205))))
我认为应该是:
batch.add(12, GL_TRIANGLES, TextureBindGroup(texture), ('t2f', (0, 0)), ('v3f', (64, 64, 0)), ('t2f', (1, 1)), ('v3f', (-64, -64, 205)), ('t2f', (0, 1)), ('v3f', (-64, 64, 205)), ('t2f', (1, 1)), ('v3f', (64, -64, 205)), ('t2f', (1, 0)), ('v3f', (64, 64, 0)), ('t2f', (0, 1)), ('v3f', (-64, -64, 205)))
请注意我是如何将最后一个参数从格式((tuple), (tuple))
更改为(tuple), (tuple))
。我不熟悉pyglet,但发现这是从documentation调用batch.add()
的正确方法。请注意,*data
表示函数调用结束时的参数变量列表,而不是您尝试的元组或列表。
试试并告诉我们它是如何为您服务的。
答案 1 :(得分:0)
“解压缩的值太多”是您执行
等操作时出现的错误a, b = "a b c".split(" ")
拆分返回三个值,但您尝试将它们分成两个。 我猜你在最后一行的某个地方有一个括号错误。尝试使用一些更清晰的语法。因为它现在非常可怕而且难以理解。
答案 2 :(得分:0)
我猜你batch.add()
的第四个参数不遵循pyglet期望的格式。检查这个可能很有用。
另外,查看pyglet中发生错误的行可以为您提供更多信息。这个问题很可能是你传递给pyglet函数的参数的一个问题。
PS:add
的{{3}}可能会引起您的兴趣。
答案 3 :(得分:0)
感谢marcog, 脚本的正确最后一行是:
batch.add(6, GL_TRIANGLES, TextureBindGroup(texture), ('v3i', (64, 64, 0, -64, -64, 205, -64, 64, 205, 64, -64, 205, 64, 64, 0, -64, -64, 205)), ('t2i', (0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1)))
即。问题解决=)
问题部分在于我将所有数据作为单个元组(marcog指出)发送,以及传递错误的一组geeometry数据的长度值; 6个顶点而不是12个。