我有一个系统,只要 redraw() 完成执行,我就会在分配的内存中缓存每个窗口的后台缓冲区。后台缓冲区被存储为一个无符号长数组,其中内容被读入如下,并且正在使用 glDrawPixels() 调用内容;
{
unsigned long *buffer;
buffer = ( unsigned long * )malloc( imgW * imgH );
redraw();
glFinish();
glReadPixels( 0, 0, imgW, imgH, GL_RGBA, GL_UNSIGNED_BYTE, buffer );
}
我曾希望优化这个过程。据我了解,通过将 glDrawPixels() 替换为带纹理的四边形,在大多数系统上,该过程应该更快。然而,我的窗口并不总是在 POT 中。经过简短的研究,人们似乎使用了这三种方法。
- GL_TEXTURE_RECTANGLE_ARB/(GL_TEXTURE_RECTANGLE?)
- 将图像的画布大小制作成 POT 图像,而扩展部分将由其他颜色填充。
- 将您的图像分解成更小的 POT 属性图块,然后相应地重新构建它们。
我的问题是这些。
- 哪种方法最会实施?目前,我倾向于第一个。不过,我认为它对旧显卡不太友好?
- GL_TEXTURE_RECTANGLE 和 GL_TEXTURE_RECTANGLE_ARB 有什么区别?
- 这会影响我读取的缓冲区中的多重采样功能吗?我收集到在所有绘图功能期间都会计算多重采样,所以这应该就像简单地复制结果像素一样?
- 如果我想出于调试目的将缓存的内容输出为图像,应该如何处理该方法?
- 还有更多方法,我还可以优化 glDrawPixels() 除非使用 FBO 或 PBO?