使用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
如果没有比这两个更好的方法吗?
映射更新的缓冲区,将值复制到app中的临时存储,取消映射更新,映射数据缓冲区并通过它设置新值
在常量缓冲区和变量缓冲区上分隔缓冲区。常量将随时间保持不变但使用glCopyBufferSubData可以在单个调用中更新变量。
由于
答案 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点)。
如果您仍希望将它们交错存储到单个缓冲区中,并且您有一些备用视频内存,则可以执行以下操作: