我几乎是opengl的新手。我想glReadPixels是可怕的,所以最好的方法是什么?我正在考虑使用一个锁定纹理矩形的函数,像glTexSubImage2D一样将像素复制到RAM,修改它,然后使用glTexSubImage2D将ram复制回纹理。这是一个好方法吗?我可以把优化想象成一个标志,说不要复制纹理,因为你将覆盖它并缓存。
我还可以使用其他哪些方法?你们有没有人能告诉我我想要的gl函数的名字(所以我可以阅读手册)或指向我的教程?我尝试使用谷歌搜索,但大多数结果看起来好像没有做我想到的。
答案 0 :(得分:6)
glReadPixels是要走的路。
是的,它很慢 - 可怕的慢。但就是这样。 DirectX对应物(例如锁定和读取像素)也不是快得多。
通常,您希望避免回读像素并使用CPU对数据执行某些操作。您可以使用像素着色器进行相当多的处理,但如果您想要进行屏幕截图(数据必须最终在CPU中),这对您没有帮助。
答案 1 :(得分:6)
如前所述glReadPixels是要走的路。 读取帧缓冲或更快地访问像素的一种方法是使用ARB_pixel_buffer_object扩展。这将使您可以异步执行glReadPixels,并且当您需要读取大量像素时,性能可以更快。性能可以快得多,因为如果使用“正确”格式,则使用DMA完成传输,并且不会消耗宝贵的CPU周期。
答案 2 :(得分:0)
最好的办法是将视频卡上的帧缓冲存储器视为只写。我认为原因是视频内存优化用于从CPU端写入,但代价是读取。 (显然视频存储器可以从视频卡端快速读出 - 它必须实时发送到显示器)
最快的解决方案将取决于您正在尝试做什么(注意详细说明?)。
没有什么可以阻止你将自己的帧缓冲区保存在主内存中,然后将其复制到每个帧的纹理并在OpenGL中渲染它。我以前做过这个并且它比glReadPixels快得多,但是你失去了回读其他OpenGL渲染活动结果的能力。如果您需要做的就是保持场景的一部分的逐帧状态。例如:生成无法通过像素着色器完成的动态纹理。
您也可以通过回读更小的数据集来逃避。当我玩非逼真的渲染时,我就这样做了。我拍摄了我的场景,将其渲染为160x120,将其读回主内存,然后将其重新渲染为2D精灵的集合。