在OpenGL中,有没有办法将帧缓冲区数据用作顶点数据而不需要通过CPU移动数据?理想情况下,帧缓冲区对象可以直接在GPU上重新形成为顶点缓冲区对象。我想使用片段着色器生成一个网格,然后渲染该网格。使用帧缓冲区作为顶点缓冲区而不移动数据到CPU
回答
有几种方法,你可以去这个,第一个已经被spudd86提到(除了你需要使用GL_PIXEL_PACK_BUFFER
,这是由glReadPixels
写的)。
另一种是使用帧缓冲区对象,然后从其顶点着色器中的纹理中读取,从顶点ID(您必须管理的)映射到纹理位置。如果这是一次性操作,尽管我会将它复制到PBO,然后绑定到GL_ARRAY_BUFFER
,然后将其用作VBO。
只需使用函数来进行复制,并让驱动程序找出如何做你想做的事情,机会只要你直接复制到顶点缓冲区,它不会实际做一个副本,而只会让你的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
编辑以感谢缓冲绑定菲尼亚斯
如果一个流浪猫对GL_PIXEL_PACK_BUFFER是正确的,也许这应该被编辑。 – 2010-04-03 05:29:33
GL_pixel_buffer_object的规范给出了一个演示如何在“使用示例”下呈现给顶点数组的示例。
以下扩展是用于解决该问题有所帮助:
GL_texture_float - 浮点内部格式以用于颜色缓冲器附着 GL_color_buffer_float - 禁用自动夹紧对片段的颜色和glReadPixels GL_pixel_buffer_object - 操作用于传送像素数据以缓冲对象
如果您可以在顶点/几何着色器中完成您的工作,则可以使用变换反馈直接写入缓冲区对象。这也可以选择跳过光栅化器和片段着色。
自GL 3.0(和ARB等效)以来,变换反馈可用作EXT_transform_feedback或核心版本。
- 1. 帧缓冲区/颜色缓冲区?
- 2. vim:移动到缓冲区?
- 3. OpenGL顶点和缓冲区
- 4. 顶点缓冲区数据到数组顶点数据流
- 5. DX10 +多个顶点缓冲区,单个索引缓冲区
- 6. 带电流缓冲区不移动点
- 7. 插入图像到帧缓冲区并写帧缓冲到png
- 8. 动态或静态顶点缓冲区?
- 9. 数据缓冲区
- 10. Ctypes偏移到缓冲区
- 11. 缓冲区不能为空参数:缓冲区
- 12. 缓冲区不能为空。参数名称:缓冲区
- 13. 绑定模板渲染缓冲区帧缓冲区在OpenGL
- 14. 带有多个绘制缓冲区的帧缓冲区
- 15. THREE.js模糊帧缓冲区
- 16. 帧缓冲区大小
- 17. 注入帧缓冲区
- 18. DBwn何时将数据库缓冲区缓冲区中的缓冲区更新为数据库磁盘?
- 19. 缓冲区溢出缓冲区长度
- 20. 帧缓冲区320x480缩放图像/ 2 =帧缓冲区640x960不缩放图像?
- 21. 动态顶点缓冲区来移动精灵各地的DirectX
- 22. Qt的帧缓冲区对象不渲染,甚至顶点
- 23. DirectX - 创建带顶点数组作为参数的缓冲区
- 24. (J2me)流作为缓冲区?
- 25. 动态缓冲区行为
- 26. C++顶点缓冲区问题
- 27. LWJGL/OpenGL顶点缓冲区对象
- 28. 带SDL的顶点缓冲区对象
- 29. 卸载OpenGL中的顶点缓冲区
- 30. Monogame顶点缓冲区代理怪异
所以如果我这样做每一帧,那么我应该用第二种方法(使用帧缓冲区作为顶点着色器中的纹理)?我想象一下,将帧缓冲区复制到每个帧的VBO可能会很慢。 – 2010-04-03 04:32:35
这种事情与硬件相关。这可能是硬件非常擅长复制到PBO,或者硬件没有从纹理单元到顶点着色器的管道。唯一真正知道的方法是尝试两者和基准。 – 2010-04-03 05:12:19
你确定数据没有通过CPU发送吗?这种方法_guarantee_ data是否由GPU从内存中提取? – 2010-04-03 05:17:16