我在 FBO 中渲染到浮点纹理,并且需要 CPU 上该纹理的所有像素的平均值。所以我认为使用 mipmapping 来计算 1x1 mipmap 的平均值非常方便,因为我节省了 CPU 计算时间,我只需要将 1 个像素传输到 CPU,而不是 1024x1024 像素。
所以我使用这条线:
glGetTexImage(GL_TEXTURE_2D, variableHighestMipMapLevel, GL_RGBA, GL_FLOAT, fPixel);
但尽管我只特别要求最高的 mipmap 级别,它的大小始终为 1x1 像素,但完成该行代码所需的时间取决于纹理的级别 0 mipmap 的大小。这对我来说毫无意义。例如,在我的测试中,1024x1024 基础纹理的这条线比 32x32 基础纹理花费的时间大约长 12 倍。
fPixel 中的结果是正确的,只包含想要的像素,但时间清楚地表明整个纹理集被转移,这对我来说是主要的原因,因为转移到 CPU 显然是我的瓶颈。
我使用 Win7 和 opengl 并在 ATI Radeon HD 4800 和 GeForce 8800 GTS 上进行了测试。
有谁知道这个问题,或者有一种聪明的方法只将最高 mipmap 的一个像素传输到 CPU?