小编Nig*_*ger的帖子

OpenGL 4 VBO和Numpy数组的问题,Pyglet/Python

我开始在Python中使用OpenGL 4(通过Pyglet和一些框架代码我从网上下载/自己编写用于加载着色器/程序),但我认为我理解的东西相当不错,所以我认为没有我代码中的某个问题.

那我的问题是什么?似乎当numpy数组或缓冲区达到一定大小时,我画画时会发生奇怪的事情.请查看链接的图片,看看我的意思. http://i.imgur.com/8Oym6VA.png?1

在图片上你可以看到我正在画一些"机器人",每个机器人都是由8个盒子组成的.机器人的数据只计算一次,使用基本的立方体顶点/颜色/索引数据,然后适当地平移/缩放/旋转并附加到更大的阵列中.在左边的图片中,我在一个VAO中绘制了172个这样的机器人,右边的图片有173个机器人.正如你所看到的,当我翻过那个"神奇"的数字时会发生奇怪的事情.看起来好像所有顶点都以某种方式连接到要在屏幕上绘制的第一个点(第一个绘制的机器人"身体"的右上方部分).如果我将第一个机器人移动到其他地方,所有点仍然连接到该点 - 以说明我确保图片中的点不以(0,0,0)或类似的为中心.左图有顶点和颜色数据,有131328个浮点数,索引数据长49248.右图有顶点和颜色数据,有132096个浮点数,而索引数据有49536个浮点数.如果我将数据分成多个VAO,那么我可以轻松地绘制100倍价值的机器人(当然有100个VAO)没有任何问题(即使1000个VAO的1000个机器人也运行良好,除了服用了很多记忆和工作约0.2 FPS).

为了测试Pyglets类(或我自己的)是否有任何问题,我还用OpenGL调用重写了整个事情,我遇到了同样的问题.那么,维也纳国际中心是不是意味着那么大(我不知何故怀疑维多利亚州立大学每个只有大约17k个三角形)?或者它与Numpy有关(我之前在Numpy中使用过更大的阵列,我不记得有任何问题)?哦顺便说一句,浮点数的大小似乎并不重要(如果所有顶点都在[-1,1]范围内,如果上升到[-35000,35000],则会发生同样的事情.

我已经非常广泛地搜索了这个主题,但我在搜索中没有遇到任何类似的东西 - 如果有的话,我道歉.我所能找到的只是使用非常大的numpy数组时的MemoryError,但是我的数组远远不能达到生成它所需的大小.

我的系统规格是:

  • 英特尔酷睿i7
  • Nvidia GeForce GTX 465
  • Windows 8 64位
  • Python 3.3(64位)
  • Pyglet 1.2alpha1
  • 从numpy的二进制包为Python 3.3 64位这里

虽然我几乎可以肯定我的代码没有任何问题,但我仍然会在这里弹出与绘图相关的片段(同样,我也尝试过基础OpenGL调用,但它没有更好的工作) .

首先,我有一个"Handler"类,它用于存储大量静态数据,因此我可以使用一个glDraw*调用(例如游戏级别或类似的东西)绘制它.它创建了添加到其数据的方法,初始化其VBO和VAO的方法以及绘制函数,该函数获取堆栈并使用它.它还获取它绘制的程序(顶点/颜色着色器).

class Handler:
def __init__(self, program):
    self.vertexData = numpy.array((), dtype=GLfloat)
    self.colorData = numpy.array((), dtype=GLfloat)
    self.indexData = numpy.array((), dtype=GLshort)

    self.program = program

def initBuffers(self):
    self.vao = GLuint()
    glGenVertexArrays(1, self.vao)
    glBindVertexArray(self.vao)

    #=======================================================================
    # Vertices
    #=======================================================================
    self.vertexBufferObject = pyglet.graphics.vertexbuffer.create_buffer(self.vertexData.nbytes, GL_ARRAY_BUFFER, GL_STATIC_DRAW)
    self.vertexBufferObject.bind()
    self.vertexBufferObject.set_data(self.vertexData.ctypes.data)
    glEnableVertexAttribArray(0)
    glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, 0)

    #=======================================================================
    # …
Run Code Online (Sandbox Code Playgroud)

opengl numpy pyglet vbo vertex-array-object

9
推荐指数
0
解决办法
1511
查看次数

确保 SQLAlchemy 不重复使用数字 ID

我正在使用 SQLAlchemy(目前正在 SQLite 上进行测试,但也需要它在其他地方工作)并且我在重用主键 ID 时遇到了问题。

例如,如果我有一些 ID 为 1-6 的内容,然后删除 ID 为 4 的内容,我仍然希望添加的下一个内容的 ID 为 7 而不是 4(就像目前发生的那样)。ID 可以在 Session 重置后重用(或不重用,无论哪种方式都无关紧要)。

我猜这取决于您使用的数据库类型(并且它是自动增量策略/实现),但我需要一种方法来使其至少在 SQLite、mySQL 和 PostgreSQL 中工作(其他不重要但他们也不会受伤)。

任何帮助或指向正确方向将不胜感激!

python sqlalchemy

3
推荐指数
1
解决办法
898
查看次数

标签 统计

numpy ×1

opengl ×1

pyglet ×1

python ×1

sqlalchemy ×1

vbo ×1

vertex-array-object ×1