0

我有一个系统,只要 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 中。经过简短的研究,人们似乎使用了这三种方法。

  1. GL_TEXTURE_RECTANGLE_ARB/(GL_TEXTURE_RECTANGLE?)
  2. 将图像的画布大小制作成 POT 图像,而扩展部分将由其他颜色填充。
  3. 将您的图像分解成更小的 POT 属性图块,然后相应地重新构建它们。

我的问题是这些。

  1. 哪种方法最会实施?目前,我倾向于第一个。不过,我认为它对旧显卡不太友好?
  2. GL_TEXTURE_RECTANGLE 和 GL_TEXTURE_RECTANGLE_ARB 有什么区别?
  3. 这会影响我读取的缓冲区中的多重采样功能吗?我收集到在所有绘图功能期间都会计算多重采样,所以这应该就像简单地复制结果像素一样?
  4. 如果我想出于调试目的将缓存的内容输出为图像,应该如何处理该方法?
  5. 还有更多方法,我还可以优化 glDrawPixels() 除非使用 FBO 或 PBO?
4

0 回答 0