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

时间:2017-05-04 10:12:29

标签: colors opengl-es alpha

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

我们希望通过仅需要存储2个通道来节省磁盘空间和内存:灰度和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。

2 个答案:

答案 0 :(得分:0)

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

如果您真的想使用GL_RG8,那么您可以通过在着色器代码中使用swizzle来修复“错误的颜色”,以便在使用它们时对频道进行重新排序,或者您可以通过设置{{ 1}}使用TEXTURE_SWIZZLE_[R|G|B|A]

答案 1 :(得分:0)

如果您不介意小问题,我会注意到我遇到的每个ES2实现(iOS,Angle,Adreno,Mali和其他一些怪异的Android驱动程序)都默默支持GL_RG8(用于格式)(和GL_RG用于internalFormat。)