交错的openGL顶点缓冲区对象之间的复制

时间:2011-02-15 15:04:28

标签: c++ opengl copy vbo

使用opengl 3.3,radeon 3870HD,c ++ ..

我对交错的数据数组有疑问。我在vector中使用了我的应用程序结构,它作为数据发送到缓冲区对象。像这样:

struct data{
  int a;
  int b;
  int c;
};

std::vector<data> datVec;
...
glBufferData(GL_ARRAY_BUFFER, sizeof(data)*datVec.size(), &datVec[0], GL_DYNAMIC_DRAW);

这很好我经常使用这个东西。但我创建的是交错数组,因此数据如下:

a1,b1,c1,a2,b2,c2,a3,b3,c3

现在我发送这个东西以便在GPU中处理并且使用变换反馈我读回缓冲区,例如b变量。所以它看起来像:

bU1, bU2, bU3

我想将更新的值复制到interleaved buffer中,这可以通过像glCopyBufferSubData这样的单个命令来完成吗?这个不合适,因为它只需要偏移量和大小不大(可能是类似于c ++中的memcpy)......结果应该是这样的:

a1, bU1, c1, a2, bU2, c2, a3, bU3, c3

如果没有比这两个更好的方法吗?

  1. 映射更新的缓冲区,将值复制到app中的临时存储,取消映射更新,映射数据缓冲区并通过它设置新值

  2. 在常量缓冲区和变量缓冲区上分隔缓冲区。常量将随时间保持不变但使用glCopyBufferSubData可以在单个调用中更新变量。

  3. 由于

2 个答案:

答案 0 :(得分:1)

glMapBuffer似乎是您正在做的更好的解决方案。

根据我的判断,基本思想是将缓冲区映射到地址空间,然后使用自己的更新方法手动更新缓冲区(可能是迭代循环)。

glBindBuffer(GL_ARRAY_BUFFER, buffer_id);
void *buffer = glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY);

if (buffer == NULL)
  //Handle Error, usually means lack of virtual memory

for (int i = 1; i < bufferLen; i += stride /* 3, in this case */)
  buffer[i] = newValue;

glUnmapBuffer(GL_ARRAY_BUFFER);

答案 1 :(得分:0)

我会将动态部分与静态部分分开(您的第2点)。

如果您仍希望将它们交错存储到单个缓冲区中,并且您有一些备用视频内存,则可以执行以下操作:

  1. 将原始交错阵列复制到备份阵列中。这需要所有组件的内存,而不仅仅是动态内存,最初是如何。
  2. 将反馈转换为原始交错,保持静态值不变。