gpt4 book ai didi

java - glBufferSubData 导致缓冲区用零填充

转载 作者:行者123 更新时间:2023-11-30 11:37:21 24 4
gpt4 key购买 nike

我正在制作一个使用 lwjgl 动态呈现文本的系统。我有一个系统设置为自动生成纹理以用于渲染,图像确实有效。这就是问题所在。
我有这段代码来初始化 2 个 VBO 和一个 VAO,它们都设置为能够处理 1024 个文本字符的数据。

vbo = GL15.glGenBuffers(); //Main VBO to hold data
vao = GL30.glGenVertexArrays();

GL30.glBindVertexArray(vao);
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo);
GL15.glBufferData(vbo, dataBuffer, GL15.GL_DYNAMIC_DRAW);
GL20.glVertexAttribPointer(0, 3, GL11.GL_FLOAT, false, 36, 0); //Position
GL20.glVertexAttribPointer(1, 4, GL11.GL_FLOAT, false, 36, 12); //Color
GL20.glVertexAttribPointer(3, 2, GL11.GL_FLOAT, false, 36, 28); //Texture Coordinates
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
GL30.glBindVertexArray(0);

indvbo = GL15.glGenBuffers(); //VBO to hold indices
GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, indvbo);
GL15.glBufferData(GL15.GL_ELEMENT_ARRAY_BUFFER, indices, GL15.GL_DYNAMIC_DRAW);
GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, 0);

然后我尝试使用这段代码更新 vbo 中的数据

GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo);
dataBuffer.clear();
for(Vertex vert : vertices) { //Vertex is a custom class to hold vertex data.
dataBuffer.put(new float[] { //Put position, color, and texture coordinates in buffer
vert.x,
vert.y,
vert.z,
vert.r,
vert.g,
vert.b,
vert.a,
vert.u,
vert.v
});
}
dataBuffer.flip();
GL15.glBufferSubData(GL15.GL_ARRAY_BUFFER, 0, dataBuffer);
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);

GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, indvbo);
indices.clear();
indices.put(indArray.getIndices());
indices.flip();
GL15.glBufferSubData(GL15.GL_ELEMENT_ARRAY_BUFFER, 0, indices);
GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, 0);

但是屏幕上什么也没有出现。如果我使用 glGetBufferSubData 从任一 vbo 检索数据,我会得到一个充满零的缓冲区。但是,如果我改变

GL15.glBufferSubData(GL15.GL_ARRAY_BUFFER, 0, dataBuffer);

成为

GL15.glBufferData(GL15.GL_ARRAY_BUFFER, dataBuffer, GL15.GL_DYNAMIC_DRAW);

我改变

GL15.glBufferSubData(GL15.GL_ELEMENT_ARRAY_BUFFER, 0, indices);

成为

GL15.glBufferData(GL15.GL_ELEMENT_ARRAY_BUFFER, indices, GL15.GL_DYNAMIC_DRAW);

一切都会出现在屏幕上,glGetBufferSubData 会返回我最初输入的内容。我不想使用 glBufferData,因为我每帧都这样做,而且我不想每帧都重新分配内存。我在做什么导致 glBufferSubData 不起作用?

最佳答案

GL15.glBufferData(vbo, dataBuffer, GL15.GL_DYNAMIC_DRAW);

首先,您没有将缓冲区对象 作为第一个参数传递;您传递将缓冲区对象绑定(bind)到的目标。你将它绑定(bind)到 GL15.GL_ARRAY_BUFFER,所以你传递了它。

其次,如果此时 dataBuffer 为空,则此 glBufferData 的大小实际上为 0。glBufferSubData 无法重新分配大小缓冲区。我建议使用适当的 glBufferData分配特定大小的缓冲区存储,而不是传递 dataBuffer

并确保您以后的 glBufferSubData 调用不会尝试在该存储之外设置内存。所以分配一堆内存。

最后,调查一些buffer object streaming techniques如果你是认真的。

关于java - glBufferSubData 导致缓冲区用零填充,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14085209/

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