一些Galaxy设备在着色器使用时出现故障?

时间:2017-12-11 18:51:46

标签: android opengl-es

我的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 Galaxy设备上引起问题?

水平模糊顶点

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);
}

模糊片段

#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);
}

1 个答案:

答案 0 :(得分:2)

我怀疑该程序无法链接,因为您已针对相关实施超出了GL_MAX_VARYING_VECTORS。您看到的错误可能已经从这个问题中逐渐消失了。 OpenGLES 2允许实现的最大变化计数低至8.见spec的表6.20。

根据gpuinfo.org's database,Galaxy S duos 2似乎有8个变化。 Galaxy Tab 3有很多不同的变种,所以我无法对此做出任何结论。

通过将一些v_blurTexCoords打包到vec4s中,您可以通过将您使用的10个电流变化(8xv_blurTexCoords,1xv_texCoord,1xv_color)压缩到8个插槽中来轻松解决问题。我建议进行最少量的包装以达到8种变化,因为在某些设备上包装紫外线会对性能产生影响(如果需要详细信息,请阅读相关的纹理读数'