从 ES2 移植到 OpenGL ES3 时,是什么导致应用程序中断?

What causes application to break when porting to OpenGL ES3 from ES2?

所以我有一个用 c++ 编写并为 Android 编译的 Unity3D 插件。

刚开始时,我使用 OpenGLES2 来最大化设备覆盖范围,但最近我决定尝试升级到 OpenGLES3,因此我使用了 gl3 headers 而不是 gl2 headers,内置,并将 Unity 上的图形 API 切换到 OpenGLES3。

不幸的是,它不再正常工作了。

代码如下:

在一个插件中我有这个:

glBindTexture(GL_TEXTURE_2D, textureID);
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, videoWidth, videoHeight, glPixFormat, glPixType, frameBuffer->buff);

其中textureID是Unity传递的一个纹理指针,framebuffer->buff是我要放入其中的图像的bytearray

在第二个插件中我有这个:

static std::vector<unsigned char> emptyPixelsAlpha(height * width, 0);

glBindTexture(GL_TEXTURE_2D, alphaID);
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, width, height, GL_ALPHA, GL_UNSIGNED_BYTE, emptyPixelsAlpha.data());

其中 alphaID 是指向 Unity 传递的纹理的指针。 (我稍微简化了这部分,它在这种情况下所做的只是在单个通道上用黑色填充与前一个相同尺寸的另一个纹理)

这两个纹理被馈送到 Unity 端的以下着色器:

 Shader "alphaMaskShader"
 {
    Properties{
      _MainTex("Base (RGB)", 2D) = "white" {}
      _Alpha("Alpha (A)", 2D) = "white" {} 
    }
    SubShader{
        Tags{ "RenderType" = "Transparent" "Queue" = "Overlay" }

        ZWrite Off
        ZTest Off

        Blend SrcAlpha OneMinusSrcAlpha
        ColorMask RGB

        Pass{
            SetTexture[_MainTex]{
            Combine texture
            }
            SetTexture[_Alpha]{
            Combine previous, texture
            }
        }
    }
}

以前,由于 "alphaID" 纹理成为 alpha 通道,此代码只会使显示的纹理完全不可见。 相反,它现在显示 "textureID" 纹理,就好像 alpha 通道不存在或者它以某种方式设置为完全不透明。

我阅读了 OpenGLES3 规范,但它明确指出它向后兼容 OpenGLES2,并且没有发现太多关于移植的问题。

我找到问题所在了。显然,GL_ALPHA 在 ES 2.0 和 3.0(或 3.2,因为那是我的设备所在的设备)之间的工作方式发生了变化。

我通过将 GL_ALPHA 与 GL_RED 交换,使其再次工作。

编辑:这显然只适用于奥利奥设备,问题仍然存在于牛轧糖上。我为此问题创建了一个专门的问题:Simple OpenGL ES 3 function works on Oreo but not on Nougat