openGLES 2 - 如何在不扩展到 32 位 RGBA 的情况下加载具有 8 位灰度和 8 位 alpha 的纹理?

openGLES 2 - How do I load a texture with 8-bit grayscale and 8-bit alpha, without expanding to 32-bit RGBA?

我们正在尝试优化我们程序中的内存使用,我们注意到我们的一些纹理可以存储为具有 alpha 值的灰度,因为当存储为 RGBA 时,RGB 值都是相同的。

我们希望通过只需要存储 2 个通道来节省磁盘 space 和内存:灰度和 alpha,均为 8 位。因此,与 32 位 RGBA 相比,磁盘和内存节省了 50%。

然而,我们遇到的障碍是我们无法弄清楚如何将此信息提供给 openGL。我们可以将图像存储在磁盘上,作为一个具有两个 8 位通道的图像,或者作为两个图像,每个图像具有一个 8 位通道。我找不到让 openGL 将其视为灰度图像的方法,因此它在内存中只有这两个通道,而不会将它们视为特定颜色,如红色和绿色 - 正如我发现 GL_RG8 存在的那样在正确的位深度下具有正确数量的通道,但颜色错误。

这在 openGLES 2 中是否可行?我们能否为 openGL 提供 2 个通道并告诉它它们不是红色和绿色而是灰色和 Alpha?

我看过这个问题:Can I use a grayscale image with the OpenGL glTexImage2D function? 但这个问题相当陈旧,GL_LUMINANCE 现在已被删除。

请注意,GL_RG8 仅存在于 OpenGL ES 3.x 以上;它不是 OpenGL ES 2.x 的一部分。对于 ES 2.x,您可以使用 GL_LUMINANCE_ALPHA。它已被弃用,但没有被删除,所以应该仍然可以正常工作。

如果您真的想使用 GL_RG8 那么您可以修复 "wrong color",方法是在着色器代码中使用 swizzles 在您使用它们时重新排序通道,或者您可以在采样器中通过 swizzle使用 glTexParameteri().

设置 TEXTURE_SWIZZLE_[R|G|B|A]

如果你不介意小罪,我注意到我遇到的每个 ES2 实现(iOS、Angle、Adreno、Mali 和其他一些奇怪的 Android 驱动程序,)都默默地支持 GL_RG8(用于格式)(以及 GL_RG 用于内部格式。)