将纹理复制到纹理的最佳方法

xyl*_*per 12 opengl benchmarking fbo textures copy

将像素从纹理复制到纹理的最佳方法是什么?

我找到了一些方法来实现这一目标.例如,有一个方法,glCopyImageSubData()但我的目标版本是OpenGL 2.1,所以我不能使用它.另外,由于性能非常重要,glGetTexImage2D()不是一种选择.由于我将视频帧作为纹理处理,因此我必须每秒复制大约30~60次.

我找到的可用选项是下一个:

  1. 为源纹理创建fbo并使用glCopyTexSubImage2D()将其复制到目标纹理.
  2. 为源和目标纹理创建fbos并对fbos进行blit.
  3. 为目标纹理创建fbo并将源纹理渲染为fbo.

您可以忽略创建fbo的成本,因为fbo只会创建一次.

请不要发布像'取决于'的东西.做你的基准.'.我不只针对一个GPU.如果有的话请,请让我知道它取决于什么.

此外,因为测量OpenGL调用的时间非常困难,所以我想知道的不是定量结果.我需要一些关于我应该避免哪种方法的建议.

如果您知道更好的复制纹理方法,请告诉我.

谢谢你的阅读.

xyl*_*per 19

由于我不知道计时器查询,我没有想到基准测试.现在,我可以做自己的基准测试.我测量了每100次操作的次数并重复了五次.创建FBO的成本不包括在内.

- S=source texture, D=destination texture, SF=FBO of S, DF=FBO of D
- operation=copying texture to texture
- op/s = how many operations for one second(average), larger is better
Run Code Online (Sandbox Code Playgroud)
  1. 使用简单的passthrough着色器创建DF并将S渲染为DF

    • 945.656op/s(100次操作105.747ms)
    • 947.293op/s(100次操作105.564ms)
    • 949.099op/s(100次操作105.363ms)
    • 949.324op/s(100次操作105.338ms)
    • 948.215op/s(100次操作105.461ms)
  2. 创建SF并对D使用glCopyTexSubImage2D()

    • 937.263op/s(100次操作106.694ms)
    • 940.941op/s(100次操作106.277ms)
    • 941.722op/s(100次操作106.188ms)
    • 941.145op/s(100次操作106.254ms)
    • 940.997op/s(100次操作106.270ms)
  3. 创建DF和SF并使用glBlitFramebuffer()

    • 828.172op/s(100次操作120.748ms)
    • 843.612op/s(100次操作118.538ms)
    • 845.377op/s(100次操作118.290ms)
    • 847.024op/s(100次操作118.060ms)
    • 843.303op/s(100次操作118.581ms)
  4. 创建DF和SF并使用glCopyPixels()

    • 525.711op/s(100次操作190.219ms)
    • 523.396op/s(100次操作191.060ms)
    • 537.605op/s(100次操作186.010ms)
    • 538.560op/s(100次操作185.680ms)
    • 553.059op/s(100次操作180.813ms)

绩效比较

passthrough shader ~ glCopyTexSubImage2D > glBlitFramebuffer >> glCopyPixels
Run Code Online (Sandbox Code Playgroud)

因此,简单的passthrough着色器显示复制纹理的最佳性能.glCopyTexSubImage2D比passthrough着色器略慢.fbo-blitting足够快但比着色器和glCopyTexSubImage2D更糟糕.glCopyPixels,我没有预料到好的结果,表现出最差的表现作为我的期望.

  • 复制深度附件呢? (2认同)