这个问题适用于 OpenGL ES 2.0(在 Android 上),但可能更适用于 OpenGL。
最终,所有性能问题都取决于实现,但是如果有人可以概括地回答这个问题或根据他们的经验回答这个问题,那将是有帮助的。我也在写一些测试代码。
我有一个 YUV (12bpp) 图像,我正在加载到我的片段着色器中的纹理和颜色转换中。一切正常,但我想看看哪里可以提高性能(以每秒帧数计)。
目前我实际上为每个图像加载了三个纹理 - 一个用于 Y 分量(类型为 GL_LUMINANCE),一个用于 U 分量(类型为 GL_LUMINANCE,当然是 Y 分量的 1/4),一个用于V 分量(GL_LUMINANCE 类型,当然是 Y 分量大小的 1/4)。
假设我可以得到任何排列的 YUV 像素(例如,U 和 V 在不同的平面上或散布在不同的平面上),将三个纹理合并为两个或一个更好?显然,无论您如何操作,推送到 GPU 的字节数都是相同的,但也许纹理越少,开销就越小。至少,它会使用更少的纹理单元。我的想法:
- 如果 U 和 V 像素相互穿插,我可以将它们加载到具有两个组件的 GL_LUMINANCE_ALPHA 类型的单个纹理中。
- 我可以将整个 YUV 图像加载为单个纹理(类型为 GL_LUMINANCE 但图像大小的 3/2),然后在片段着色器中我可以在同一纹理上调用 texture2D() 三次,做一些算术图输出正确的坐标传递给 texture2D 以获得 Y、U 和 V 分量的正确纹理坐标。