2011-02-15 29 views
1

使用opengl 3.3,radeon 3870HD,C++ ..在交错的OpenGL顶点缓冲区对象之间进行复制

我得到了关于交错数据阵列的问题。我得到了我的向量中的应用程序结构,它作为数据发送到缓冲区对象。事情是这样的:

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 

如果不是有比这2我的好办法?

  1. 地图更新缓冲器,的值复制到临时存储在应用程序,去映射更新,地图数据缓冲器,并通过它itterating设置新值

    上恒定缓冲器和可变缓冲器
  2. 单独的缓冲器。常会留一段时间,但使用glCopyBufferSubData可以在单个呼叫更新变量同一个..

感谢

+0

我会保持更新的数据分开为2. – Bahbar 2011-02-15 15:39:54

回答

0

我会用动态部分(你的点2)分开动态部分。

如果你仍然想保持交织成一个单一的缓冲区,你有一些空闲显存,你可以做到以下几点:

  1. 复制原来的交织排列到备份一个。这需要所有组件的内存,而不仅仅是动态组件,它本来是如何的。
  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); 
+0

以及没有一个步骤的功能...... btw那么在同一时间映射2个缓冲区呢?因为这只是写作,但实际上有读/写操作正在进行..在客户端内存中使用某些存储或可以完全服务器端 – Raven 2011-02-15 18:17:58

+0

据我所知,glMapBuffer只允许将缓冲区映射到客户端内存,并且每个类型只有一个缓冲区。从外观上看,您可以映射多个不同类型的缓冲区。 – James 2011-02-15 19:34:22

相关问题