2010-04-03 27 views

回答

3

有几种方法,你可以去这个,第一个已经被spudd86提到(除了你需要使用GL_PIXEL_PACK_BUFFER,这是由glReadPixels写的)。

另一种是使用帧缓冲区对象,然后从其顶点着色器中的纹理中读取,从顶点ID(您必须管理的)映射到纹理位置。如果这是一次性操作,尽管我会将它复制到PBO,然后绑定到GL_ARRAY_BUFFER,然后将其用作VBO。

+0

所以如果我这样做每一帧,那么我应该用第二种方法(使用帧缓冲区作为顶点着色器中的纹理)?我想象一下,将帧缓冲区复制到每个帧的VBO可能会很慢。 – 2010-04-03 04:32:35

+0

这种事情与硬件相关。这可能是硬件非常擅长复制到PBO,或者硬件没有从纹理单元到顶点着色器的管道。唯一真正知道的方法是尝试两者和基准。 – 2010-04-03 05:12:19

+0

你确定数据没有通过CPU发送吗?这种方法_guarantee_ data是否由GPU从内存中提取? – 2010-04-03 05:17:16

3

只需使用函数来进行复制,并让驱动程序找出如何做你想做的事情,机会只要你直接复制到顶点缓冲区,它不会实际做一个副本,而只会让你的VBO对数据的引用。

要小心的最主要的是使用的东西,你告诉它是与像素数据的操作顶点数据有些司机可能不喜欢你...

编辑:大概就像下面可能或可能无法正常工作......(IIRC的规范说应该)

int vbo; 
glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, vbo); 
// use appropriate pixel formats and size 
glReadPixels(0, 0, w, h, GL_RGBA, GL_UNSIGNED_BYTE, 0); 
glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, 0); 

glEnableClientState(GL_VERTEX_ARRAY); 
glBindBufferARB(GL_ARRAY_BUFFER_ARB, vbo); 
// draw stuff 

编辑以感谢缓冲绑定菲尼亚斯

+2

如果一个流浪猫对GL_PIXEL_PACK_BUFFER是正确的,也许这应该被编辑。 – 2010-04-03 05:29:33

1

如果您可以在顶点/几何着色器中完成您的工作,则可以使用变换反馈直接写入缓冲区对象。这也可以选择跳过光栅化器和片段着色。

自GL 3.0(和ARB等效)以来,变换反馈可用作EXT_transform_feedback或核心版本。