所以我有一个用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并且没有发现很多关于移植问题。
答案 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