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

时间:2018-02-07 16:05:39

标签: unity3d opengl-es glsl opengl-es-2.0 opengl-es-3.0

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

当我开始时,我使用OpenGLES2来最大化设备覆盖范围,但最近我决定尝试升级到OpenGLES3,所以我将gl3标头包含在gl2标头中,而不是gl2标头,构建并将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
            }
        }
    }
}

之前,这段代码只会使显示的纹理完全不可见,因为&#34; alphaID&#34;纹理成为alpha通道。 相反,它现在显示&#34; textureID&#34;纹理好像alpha通道不在那里,或者它以某种方式设置为完全不透明。

我阅读了OpenGLES3规范,但它清楚地表明它向后兼容OpenGLES2并且没有发现很多关于移植问题。

1 个答案:

答案 0 :(得分:0)

我发现了问题所在。显然,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