gpt4 book ai didi

android - 某些 Galaxy 设备无法使用着色器?

转载 作者:行者123 更新时间:2023-11-29 19:04:33 25 4
gpt4 key购买 nike

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

模糊 fragment

#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's database Galaxy S duos 2 似乎有 8 个版本。 Galaxy Tab 3 有很多不同的变体,所以我无法就此得出任何结论。

通过将一些 v_blurTexCoords 打包到 vec4s 中,将您正在使用的 10 个当前变量(8xv_blurTexCoords、1xv_texCoord、1xv_color)压缩到 8 个槽中,您应该能够轻松解决这个问题。我建议进行达到 8 个变量所需的最小打包量,因为在某些设备上打包 UV 会影响性能(如果需要详细信息,请阅读“相关纹理读取”)。

关于android - 某些 Galaxy 设备无法使用着色器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47759478/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com