gpt4 book ai didi

python - 如何使用 VBO 和 Pyglet 更新数据

转载 作者:太空宇宙 更新时间:2023-11-03 12:50:33 26 4
gpt4 key购买 nike

我想用 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()

最佳答案

您不需要在更新中每次都调用 glBufferData - 创建并填充 VBO 一次(参见 setup_initial_points)并且只用 glBufferSubData 更新它。如果您只使用单个 VBO,您还可以注释掉 update() 中的 glBindBuffer 调用(参见下面的代码)。GL_DYNAMIC_DRAWGL_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()

关于python - 如何使用 VBO 和 Pyglet 更新数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10065631/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com