从firebase日志中,我可以看到大约1%的应用程序用户遇到了着色器编译错误。
我阅读了源代码,不知道为什么它不能在某些设备上运行。
这是顶点着色器。
precision mediump float;
uniform mat4 uMVPMatrix;
attribute vec4 vPosition;
varying vec2 textureCoordinate;
void main() {
textureCoordinate=vec2((1.0+vPosition.x)/2.0, (1.0-vPosition.y)/2.0);
gl_Position = uMVPMatrix * vPosition;
}
这是片段着色器。
precision mediump float;
varying vec2 textureCoordinate;
uniform sampler2D inputImageTexture;
uniform float flipH;
uniform float flipV;
uniform float angle;
uniform float blendAlpha;
uniform vec4 sampleCoord1;
uniform vec4 sampleCoord2;
uniform float blurV;
uniform sampler2D inputImageTexture1; //frame
uniform sampler2D inputImageTexture2;
uniform sampler2D inputImageTexture3;
uniform sampler2D inputImageTexture4;
uniform sampler2D inputImageTexture5;
uniform sampler2D inputImageTexture6;
uniform sampler2D inputImageTexture7;
uniform float fW; //sample proportionally
uniform float fH;
uniform float sX; // start of x and y.
uniform float sY;
vec3 texel;
uniform float iGlobalTime; //for video
uniform float alpha;
vec3 effect(vec3 texel){
return texel;
}
vec2 cllCoord1(float s, float t){
return vec2(sampleCoord1.x + s*sampleCoord1.z, sampleCoord1.y + t*sampleCoord1.w);
}
vec2 cllCoord2(float s, float t){
return vec2(sampleCoord2.x + s*sampleCoord2.z, sampleCoord2.y + t*sampleCoord2.w);
}
void main() {
float s=textureCoordinate.x;
float t=textureCoordinate.y;
vec3 srcTexel = texture2D(inputImageTexture1, cllCoord1(s,t)).rgb;
vec3 desTexel = texture2D(inputImageTexture7, cllCoord2(s,t)).rgb;
if( s <= blendAlpha ){
desTexel = texture2D(inputImageTexture7, cllCoord2(1.0 + s -blendAlpha, t)).rgb;
}else{
desTexel = vec3(0.0);
}
if(length(textureCoordinate-vec2(0.0, 1.0))>= blendAlpha*1.42){
texel=srcTexel;
}else{
texel=desTexel;
}
texel=effect(texel);
gl_FragColor= vec4(texel, alpha);
}
编译后,compileStatus [0]为假。
final int[] compileStatus = new int[1];
GLES20.glGetShaderiv(shader, GLES20.GL_COMPILE_STATUS, compileStatus, 0);
if (compileStatus[0] != GLES20.GL_TRUE) {
我尝试分析上面的着色器,但是我不知道为什么它不能在某些设备上运行。在我自己的设备/仿真器中,它总是可以正常工作!。
这不应该是编译错误,否则我会得到更详细的日志,例如未编译的行。
答案 0 :(得分:1)
如果只有1%的用户失败,那么您可能是驱动程序错误的领域。通过GLSL参考编译器运行代码来确认这一点通常很有用,但是我强烈怀疑是这种情况:glslang。
如果我不得不猜测您所做的事情会使不兼容的编译器感到困惑,那么我会寻求:
texel
的var既用作全局变量又用作函数参数。texture2D
的呼叫,可以通过if
语句跳过。如果有mipmap,则这是未定义的行为。 访问非均匀物体内部的Mip映射纹理 条件块给出了不确定的值。非均匀条件 块是在编译时无法确定其执行的块。