gpt4 book ai didi

java - 使用 glBufferSubData() 更新 VBO 数据

转载 作者:搜寻专家 更新时间:2023-10-31 19:40:33 28 4
gpt4 key购买 nike

我目前正在开发一款使用 Java 1.6 和 LWJGL 编写的 2d 自上而下 RPG。我在我的游戏中实现了 VBO 的使用,现在我维护其中两个:一个用于顶点数据,一个用于纹理坐标。

一切正常,只是我仍然没有真正合乎逻辑的方法来更新对象。例如,如果我想要某个图 block 更改其纹理(更改 VBO 内的纹理坐标以显示纹理表的另一个区域),我看不到仅更改对应于的纹理坐标的方法这个单一的瓷砖。我现在能想到的可能是用每个循环所需的所有数据填充缓冲区,然后每帧用 glBufferData 上传它们。它有效,但似乎不是最好的方法(或者确实如此?)。

现在,有一个 glBufferSubData 命令,它不会分配新内存,而只会更改我告诉它要更改的部分。问题是我不知道如何跟踪必须更改的区域(偏移量)。 LWJGL 提供了一个 glBufferSubData(target, offset, data);命令,它只需要缓冲区的开始就可以工作。偏移量类似于索引吗?

因此,如果我先将这些缓冲区上传到 VBO,然后想更改第二个 float[] 的第二个值:

FloatBuffer vertexData = BufferUtils.createFloatBuffer(amountOfVertices * vertexSize);
vertexData.put(new float[]{100, 100, 300, 100, 300, 300, 100, 300});
vertexData.put(new float[]{400, 100, 600, 100, 600, 300, 400, 300});
vertexData.flip();

我会生成新数据,将其放入一个小的 FloatBuffer 中,然后使用 glBufferSubData(GL_VERTEX_ARRAY, 10, newFloatBuffer); 上传它? 10 是因为我想从第十个旧值开始更改值。

是吗?有更好的方法吗?再说一次:如果我每帧都重新上传整个数据可以吗?

最佳答案

LWJGL's glBufferSubData() 期望偏移量作为字节数,因为应该能够将任意数据写入任意缓冲区位置。如果您想更新索引 i 处的 float ,则偏移量将为 i * 4,因为 java float 通常占用 4 个字节。所有剩余的缓冲区内容将被写入,因此目标缓冲区的容量至少需要
(i + floatBuffer.remaining()) * 4 字节。有关正确准备,请参阅缓冲区 flip()方法或使用position(int)连同 limit(int)指定要写入的剩余内容。

只要您不使用临时 FloatBuffers 多次调用 glBufferSubData(),这种更新策略就可以。您还可以有第二个具有相同大小的目标缓冲区用于交换 (ping pong),其中一个可以使用 MapBuffer() 进行映射以进行整体更新,而另一个正在使用中。

我宁愿在客户端持有一个完整的 FloatBuffer 并使用 glBufferData() 一次上传它,而不是多次调用 glBufferSubData()。但在不知道一些数字的情况下,很难判断。

关于java - 使用 glBufferSubData() 更新 VBO 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11959302/

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