在三星S7 Edge(CPU为猎户座)上调试Fragment Shader,为了快速验证,强制给gl_FragColor赋值,代码如下所示。
#extension GL_OES_EGL_image_external : require
precision mediump float;
varying vec2 vTextureCoord;
uniform samplerExternalOES sExternalTexture;
uniform vec4 uColor;
// main()
void main() {
vec4 originalColor = clamp(texture2D(sExternalTexture, vTextureCoord), 0.0, 1.0);
gl_FragColor = originalColor * uColor;
gl_FragColor = vec4(0.3, 0.3, 0.3, 1.0);
}
这在iOS上表现是完全符合预期的。然而,在S7 Edge上,总会出现glGetUniformLocation查找sExternalTexture、uColor变量返回-1的现象。由于着色器代码是在应用运行期间才开始编译,故Android Studio并不会主动修改源代码,这在glCompileShader时可验证,而且着色器可正常编译、链接。几经折腾,暴力加上分支判断才实现了这个简单的验证功能,参考代码如下所示。
另外,无论是否开始着色器代码调试及优化功能,S7 Edge都会“主动”优化着色器代码。
#extension GL_OES_EGL_image_external : require
#pragma debug(on) // 没用,S7 Edge会“忽略”
#pragma optimize(off) // 没用,S7 Edge会“忽略”
precision mediump float;
varying vec2 vTextureCoord;
uniform samplerExternalOES sExternalTexture;
uniform vec4 uColor;
uniform int uIndex;
// main()
void main() {
if (uIndex == 1) {
vec4 originalColor = clamp(texture2D(sExternalTexture, vTextureCoord), 0.0, 1.0);
gl_FragColor = originalColor * uColor;
} else {
gl_FragColor = vec4(0.3, 0.3, 0.3, 1.0);
}
}