诡异的三星S7 Edge主动优化片段着色器代码现象

在三星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);
  }
}

你可能感兴趣的:(诡异的三星S7 Edge主动优化片段着色器代码现象)