Android 肾上腺220 GLSL缺陷
我们在使用Adreno 220 GPU的索尼Xperia手机上遇到GLSL alpha测试问题。该设备正在运行安卓4.0.4 在Adreno 200、Adreno 205、Adreno 225以及Tegra2、Mali400和PowerVR GPU上工作正常 着色器代码:Android 肾上腺220 GLSL缺陷,android,opengl-es,opengl-es-2.0,glsl,Android,Opengl Es,Opengl Es 2.0,Glsl,我们在使用Adreno 220 GPU的索尼Xperia手机上遇到GLSL alpha测试问题。该设备正在运行安卓4.0.4 在Adreno 200、Adreno 205、Adreno 225以及Tegra2、Mali400和PowerVR GPU上工作正常 着色器代码: // vertex uniform highp mat4 uMVPMatrix; attribute highp vec4 aPosition; attr
// vertex
uniform highp mat4 uMVPMatrix;
attribute highp vec4 aPosition;
attribute highp vec2 aTextureCoord;
varying mediump vec2 vTextureCoord;
void main() {
gl_Position = uMVPMatrix * aPosition;
vTextureCoord = aTextureCoord;
}
// fragment
precision mediump float;
varying mediump vec2 vTextureCoord;
uniform sampler2D sTexture;
uniform sampler2D sAlpha;
uniform vec4 uBlendColor;
void main() {
vec4 base = texture2D(sTexture, vTextureCoord);
if(texture2D(sAlpha, vTextureCoord).r < 0.5){ discard; }
else { gl_FragColor = base * uBlendColor; }
}
//顶点
均匀高阶mat4-umvp矩阵;
属性高位向量4;
属性highp vec2 ATEXTROCORD;
可变媒介向量2 vTextureCoord;
void main(){
gl_位置=UMVP矩阵*位置;
vTextureCoord=ATextureCord;
}
//碎片
精密中泵浮子;
可变媒介向量2 vTextureCoord;
均匀结构;
均匀输卵管;
颜色均匀;
void main(){
vec4-base=texture2D(sTexture,vtexturecord);
if(texture2D(sAlpha,vtexturecord).r<0.5){discard;}
else{gl_FragColor=base*uBlendColor;}
}
错误截图:
其他设备上的正确结果:
请告知导致此类视觉故障的原因、查找原因的方法以及可能的解决方法
编辑:HTC Rezound的旧股票ROM也确认了相同的错误。更多信息请参见我的答案。我要求在xda开发者的不同固件上测试应用程序。在某些设备上,它工作正常,而在另一个设备上,则存在此视觉故障 因此,我得出结论,这与OpenGL驱动程序中的某些错误有关,这些错误在某些非库存ROM中得到了修复
编辑:确认它是高通公司旧款Adreno 220驱动程序中的一个bug。在HTC Rezound手机(也叫Adreno 220)的4.0.3版ROM上也有同样的错误,它不仅出现在我的应用程序中,也出现在一些游戏中——丢失了某些物体上的某些线条或像素。在生根和安装CM 4.1之后,bug消失了。祝您好运。我的解决办法是在谷歌中排除这些设备play@rds不可能。:)我不会轻易放弃——我的应用程序中的任何视觉故障都必须消除。如果我有机会在那个设备上调试,我敢肯定它在发布应用程序到Google Play之前就被删除了。我唯一的猜测是,你的alpha纹理可能有一些非常接近0.5的值,并且由于四舍五入,一些你认为>=0.5的值正在评估为<0.5。你能告诉我们更多关于你的阿尔法纹理吗?它是如何生成的,微型/磁性过滤器,边框包裹等?@SchighSchagh它是blacck和white(r==g==b)ETC1压缩纹理,没有mipmap。最近的最小过滤器,线性mag过滤器。边界没有被钳制。放弃!这可能是移动驱动程序特有的问题,可能不可能或不值得解决。如果你正在编写墙纸应用程序,我不认为这是一个杀手级功能,因此最好禁用它。你是否尝试过从你的UV坐标(a-la DirectX)中减去半texel…?在我基于220的HTC Sensation XE上运行良好,顺便说一句。@Goz我的着色器的所有代码都有问题。我还尝试了对片段着色器逻辑的3种不同修改,但都没有效果。DirectX UV coord“修复”通常是从C/C++代码执行的,现在与GLSL有关。。。