Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用glBufferSubData()更新VBO数据_Java_Opengl_Vbo - Fatal编程技术网

Java 使用glBufferSubData()更新VBO数据

Java 使用glBufferSubData()更新VBO数据,java,opengl,vbo,Java,Opengl,Vbo,我目前正在使用LWJGL开发一个用Java1.6编写的2d自顶向下RPG。我在游戏中实现了VBOs的使用,现在我维护了其中两个:一个用于顶点数据,另一个用于纹理坐标 除了我仍然没有一个真正合乎逻辑的方法来更新对象之外,一切都很好。例如,如果我希望某个平铺更改其纹理(更改VBO内的纹理坐标以显示纹理表的另一个区域),我看不到只更改与此单个平铺对应的纹理坐标的方法。我现在所能想到的可能就是用每个循环所需的所有数据填充缓冲区,并在每个帧上传glBufferData。它是有效的,但似乎不是最好的方法(或

我目前正在使用LWJGL开发一个用Java1.6编写的2d自顶向下RPG。我在游戏中实现了VBOs的使用,现在我维护了其中两个:一个用于顶点数据,另一个用于纹理坐标

除了我仍然没有一个真正合乎逻辑的方法来更新对象之外,一切都很好。例如,如果我希望某个平铺更改其纹理(更改VBO内的纹理坐标以显示纹理表的另一个区域),我看不到只更改与此单个平铺对应的纹理坐标的方法。我现在所能想到的可能就是用每个循环所需的所有数据填充缓冲区,并在每个帧上传glBufferData。它是有效的,但似乎不是最好的方法(或者说是吗?)

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

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

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是因为我想从第十个旧值开始更改值

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

glBufferSubData()
期望偏移量作为字节计数,因为应该能够将任意数据写入任意缓冲区位置。如果要更新索引
i
处的浮点值,则偏移量将为
i*4
,因为java浮点值通常为4字节。所有剩余的缓冲区内容都将被写入,因此,目标缓冲区的容量要求至少为
(i+floatBuffer.remaining())*4个字节。
有关正确的准备,请参阅缓冲区方法或与一起使用,以指定要写入的剩余内容

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


我宁愿在客户端保存一个完整的FloatBuffer,并使用
glBufferData()
立即上传它,而不是多次调用
glBufferSubData()
。但是如果不知道一些数字,就很难判断。

有更简单的方法。您可以简单地使用另一个纹理绘制相同的几何体。或者在顶点着色器中修改纹理坐标。非常感谢。我将实现客户机浮动缓冲区策略并暂时保留它。稍后我将尝试顶点着色器。不客气!着色器是一个有趣的领域。如果必须更改大小相同的纹理区域,则阵列纹理可以替代纹理贴图/图纸。3D纹理还可以用于平滑地混合变化。