当前位置: 首页 > 知识库问答 >
问题:

如何使用VBO和Pyglet更新数据

祁博雅
2023-03-14

我想用Pyglet制作一个每帧都在变化的网格。因此,我需要经常更新顶点,我认为VBO是最快的方法(如果我错了,请纠正我)。下面是一个要点示例。这是正确的做法吗?我读到应该尽量减少glBindBuffer调用的数量,但在这里它是每帧调用一次的。此外,启用了GL_DYNAMIC_DRAW,但如果我将其更改为GL_STATIC_DRAW,它仍在工作。这让我想知道这是否是一个快速计算的正确设置

import pyglet
import numpy as np
from pyglet.gl import *
from ctypes import pointer, sizeof

vbo_id = GLuint()
glGenBuffers(1, pointer(vbo_id))

window = pyglet.window.Window(width=800, height=800)

glClearColor(0.2, 0.4, 0.5, 1.0)

glEnableClientState(GL_VERTEX_ARRAY)

c = 0

def update(dt):
    global c
    c+=1
    data = (GLfloat*4)(*[500+c, 100+c,300+c,200+c])
    glBindBuffer(GL_ARRAY_BUFFER, vbo_id)
    glBufferData(GL_ARRAY_BUFFER, sizeof(data), 0, GL_DYNAMIC_DRAW)
    glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(data), data)


pyglet.clock.schedule(update)

glPointSize(10)

@window.event
def on_draw():

    glClear(GL_COLOR_BUFFER_BIT)
    glColor3f(0, 0, 0)

    glVertexPointer(2, GL_FLOAT, 0, 0)
    glDrawArrays(GL_POINTS, 0, 2)


pyglet.app.run()

共有1个答案

葛泳
2023-03-14

您不需要在更新中每次都调用glBufferData-创建并填充VBO一次(参见setup_initial_points),并且仅使用glBufferSubData更新它。如果您只使用一个VBO,您还可以注释掉glBindBuffer调用Update()(请参阅下面的代码)。GL_DYNAMIC_DRAWvsGL_STATIC_DRAW在这方面不会有太大的不同例如,因为您将很少的数据推送到GPU上。

import pyglet
from pyglet.gl import *
from ctypes import pointer, sizeof

window = pyglet.window.Window(width=800, height=800)

''' update function  '''
c = 0
def update(dt):
    global c
    c+=1
    data = calc_point(c)
    # if there's only on VBO, you can comment out the 'glBindBuffer' call
    glBindBuffer(GL_ARRAY_BUFFER, vbo_id)
    glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(data), data)

pyglet.clock.schedule(update)


''' draw function  '''
@window.event
def on_draw():

    glClear(GL_COLOR_BUFFER_BIT)
    glColor3f(0, 0, 0)

    glVertexPointer(2, GL_FLOAT, 0, 0)
    glDrawArrays(GL_POINTS, 0, 2)


''' calculate coordinates given counter 'c' '''
def calc_point(c):
    data = (GLfloat*4)(*[500+c, 100+c, 300+c, 200+c])
    return data


''' setup points '''
def setup_initial_points(c):
    vbo_id = GLuint()
    glGenBuffers(1, pointer(vbo_id))

    data = calc_point(c)
    glBindBuffer(GL_ARRAY_BUFFER, vbo_id)
    glBufferData(GL_ARRAY_BUFFER, sizeof(data), 0, GL_DYNAMIC_DRAW)

    return vbo_id


############################################

vbo_id = setup_initial_points(c)

glClearColor(0.2, 0.4, 0.5, 1.0)
glEnableClientState(GL_VERTEX_ARRAY)

glPointSize(10)
pyglet.app.run()
 类似资料:
  • pyglet 提供了面向对象的编程接口,用来开发游戏和其他视觉效果非常丰富的跨平台应用程序。

  • 问题内容: 我正在寻求了解VBO的帮助。我已经做了大量研究,并找到了关于该主题的教程,但是它们对我来说仍然很模糊。我有几个问题: 一个VBO应该在哪里创建,我应该如何创建一个? 我目前正在使用下面的代码初始化我的顶点和索引缓冲区: 如果我是正确的话,这不是在创建VBO。因此,如果我想制作一个VBO,创建VBO的代码会紧接在上面列出的代码之后吗?如果是这样,它将如何创建? 另外,如何将VBO渲染并绘

  • 我有以下不便之处,我想只使用PostgreSQL更新JSON数组的键。我有以下json: 如果“othern”=X,我需要将“othern”更新为另一个数字 (X是我传递给查询的任何数字。例如,如果othern=5,则更新othern)。 这个JSON可能要大得多,所以我需要一些可以在JSON数组中迭代的东西,找到所有与X数匹配的“othern”,并替换为新的。非常感谢。 我尝试了Postgres

  • 我正在使用plugin jQuery datatables并加载我在页面底部DOM中加载的数据,并以以下方式启动插件: 现在,在执行一些操作后,我想使用ajax获得新数据(但不是ajax选项构建在数据中-不要误会我!)并用这些数据更新表。如何使用数据API做到这一点?留档很混乱,我找不到解决办法。任何帮助将非常感谢。谢谢。

  • 这个问题几乎说明了一切。使用JPARepository,我如何更新一个实体? JPARepository只有一个save方法,它并不告诉我它实际上是create还是update。例如,我向数据库用户插入一个简单的对象,它有三个字段:、和: 然后我只需调用,此时它实际上是对数据库的插入: 到目前为止还不错。现在我想更新这个用户,比如说改变他的年龄。为此,我可以使用查询,无论是QueryDSL还是Na

  • 我想用AJAX和Laravel5.2框架更新数据库表列。我有一个按钮,当我点击该按钮时,它会将一列从更新为。我还使用sweetAlert插件进行弹出式设计。我找了很多。但我没有找到完美的程序。我试过这样做: 路线: WinnerController: 视图中的脚本: 刀片: 刀片前端: 这是更新栏,但更新后它重定向了另一个页面,它只显示弹出它不需要提交弹出的确认按钮。有办法这么做吗?有人能回答我下