一些银河设备在着色器使用情况下失败



我有一个用于模糊对象的Android应用程序的着色器。它在我的所有设备以及绝大多数用户的设备上运行良好。

但是,一个常见的主题是使用Android 4.4.2 仅带有Galaxy Tab 3,Galaxy S Duos 2和其他一些Galaxy设备的崩溃(我有一个Galaxy Tab 4,并且可以正常很好)。

我正在使用libgdx,而我遇到的唯一错误报告是:

Thread: GLThread 110, Exception: java.lang.IllegalArgumentException: no uniform with name 'u_projTrans' in shader
at com.badlogic.gdx.graphics.glutils.ShaderProgram.fetchUniformLocation(ShaderProgram.java:308)
at com.badlogic.gdx.graphics.glutils.ShaderProgram.fetchUniformLocation(ShaderProgram.java:298) 
at...

统一的u_projTrans是一个内部的一个libgdx,在所有着色器中都希望通过投影矩阵传递,我可以像在所有设备上(包括星系)一样,在顶点着色器中确认它在顶点着色器中。


我认为这是一个通用的"后备"崩溃描述,因为这些设备上的一个特定的着色器出现了其他问题。

试图不必出去购买用于测试的二手设备,也许有人可以知道为什么此着色器仅在选择几个4.4.2的4.4.2 Galaxy设备上引起问题? p> 水平腔顶点

uniform mat4 u_projTrans;
uniform float u_blurPixels;
uniform float u_texelSize;
attribute vec4 a_position;
attribute vec2 a_texCoord0;
attribute vec4 a_color;
varying vec2 v_texCoord;
varying vec2 v_blurTexCoords[8];
varying vec4 v_color;
void main()
{
    v_texCoord = a_texCoord0;
    v_color =  a_color;
    v_color.a = v_color.a * (255.0 / 254.0);
    gl_Position = u_projTrans * a_position;
    float blurDistance3 = u_blurPixels * u_texelSize;
    float blurDistance2 = blurDistance3 * 0.75;
    float blurDistance1 = blurDistance3 * 0.5;
    float blurDistance0 = blurDistance3 * 0.25;
    v_blurTexCoords[ 0] = v_texCoord + vec2(-blurDistance0, 0.0);
    v_blurTexCoords[ 1] = v_texCoord + vec2( blurDistance0, 0.0);
    v_blurTexCoords[ 2] = v_texCoord + vec2(-blurDistance1, 0.0);
    v_blurTexCoords[ 3] = v_texCoord + vec2( blurDistance1, 0.0);
    v_blurTexCoords[ 4] = v_texCoord + vec2(-blurDistance2, 0.0);
    v_blurTexCoords[ 5] = v_texCoord + vec2( blurDistance2, 0.0);
    v_blurTexCoords[ 6] = v_texCoord + vec2(-blurDistance3, 0.0);
    v_blurTexCoords[ 7] = v_texCoord + vec2( blurDistance3, 0.0);
}

Blur Frag

#ifdef GL_ES
#define LOWP lowp
precision mediump float;
#else
#define LOWP
#endif
uniform sampler2D u_texture;
varying vec2 v_texCoord;
varying vec2 v_blurTexCoords[8];
varying LOWP vec4 v_color;
void main()
{
    vec4 summedColor = vec4(0.0);
    float overallAlpha = 0.0;
    int i = 0;
    vec4 fetchedColor;
    float scaleWithAlpha;
    // 0
    fetchedColor = texture2D(u_texture, v_texCoord);
    scaleWithAlpha = fetchedColor.a * 0.2204;
    summedColor += fetchedColor * scaleWithAlpha;
    overallAlpha += scaleWithAlpha;
    // 1
    fetchedColor = texture2D(u_texture, v_blurTexCoords[i++]);
    scaleWithAlpha = fetchedColor.a * 0.19;
    summedColor += fetchedColor * scaleWithAlpha;
    overallAlpha += scaleWithAlpha;
    fetchedColor = texture2D(u_texture, v_blurTexCoords[i++]);
    scaleWithAlpha = fetchedColor.a * 0.19;
    summedColor += fetchedColor * scaleWithAlpha;
    overallAlpha += scaleWithAlpha;
    // etc
    summedColor /= overallAlpha;
    gl_FragColor = vec4(summedColor.xyz, overallAlpha * v_color.a);
}

我怀疑该程序无法链接,因为您超过了有关实现的gl_max_varying_vectors。您看到的错误可能是从这个问题中脱颖而出的。OpenGles 2允许实现的最大变化为低至8。参见Spec的表6.20

根据gpuinfo.org的数据库,Galaxy S Duos 2似乎具有8个变化。Galaxy Tab 3有很多不同的变体,所以我真的无法得出任何结论。

您应该能够通过将所使用的10个当前变化(8xv_blurtexcoords,1XV_TEXCOORD,1XV_COLOR)挤压到8个插槽中,可以轻松地工作。我建议您完成达到8个变化所需的最低包装量,因为在某些设备上,包装紫外线会产生性能影响(如果需要详细信息,请阅读"依赖的纹理读取")。

最新更新