1

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

我有关于交错数据数组的问题。我在向量中获得了我的应用程序结构,它作为数据发送到缓冲区对象。像这样的东西:

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

我想将更新的值复制到交错缓冲区中,这可以通过 glCopyBufferSubData 之类的单个命令来完成吗?这个不合适,因为它只需要偏移量和大小而不是步幅(可能类似于 c++ 中的 memcpy)......结果应该如下所示:

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

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

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

  2. 常量缓冲区和变量缓冲区上的单独缓冲区。常数会随着时间的推移保持不变,但使用 glCopyBufferSubData 变量可以在一次调用中更新..

谢谢

4

2 回答 2

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);
于 2011-02-15T15:39:13.557 回答
0

I would separate the dynamic part with a static one (your point 2).

If you still want to keep them interleaved into a single buffer, and you have some spare video memory, you can do the following:

  1. Copy the original interleaved array into a backup one. This requires memory for all components rather than only dynamic ones, how it was originally.
  2. Transform Feedback into the original interleaved, carrying the static values unchanged.
于 2011-02-15T18:21:28.157 回答