Фрагментация Android на примере фрагментного шейдера.

Меня уже не удивляют различные варианты обработки различных визуальных эффектов устройствами на Android. В последний раз я столкнулся вот с таким примером, при работе над очередными живыми обоями.

Я использую фрагментный шейдер, чтобы сделать ночь в обоях. Для этого я умножаю текстуру на вектор 0.5 0.5 0.5 , что позволяет затемнить всю сцену. Обычно, и это корректно, я использую такой фрагментный шейдер:

precision mediump float;
uniform sampler2D u_texture;
varying vec3 v_vertex;
varying vec2 v_texcoord;
varying vec2 v_texcoordAlpha;
void main() {
 vec4 one=texture2D(u_texture, v_texcoord);
 vec4 two=vec4(0.5, 0.5, 0.5, 1.0);
 one.a=texture2D(u_texture, v_texcoordAlpha).r;
 gl_FragColor = one * two;
}

В данном коде, по мимио обработки текстуры в атласе, отвечающей за альфа канал, я произвожу умножение на вектор

vec4 two=vec4(0.5, 0.5, 0.5, 1.0);

Данный код работает на всех устройствах корректно.

Если переписать шейдер :

precision mediump float;
uniform sampler2D u_texture;
varying vec3 v_vertex;
varying vec2 v_texcoord;
varying vec2 v_texcoordAlpha;
void main() {
 vec4 one=texture2D(u_texture, v_texcoord);
 one.a=texture2D(u_texture, v_texcoordAlpha).r;
 one.r=one.r * 0.5;
 one.g=one.g * 0.5;
 one.b=one.b * 0.5;
 gl_FragColor = one;
}

По сути, работая с каждой компонентой R, G  или B в отдельности

one.r=one.r * 0.5;
one.g=one.g * 0.5;
one.b=one.b * 0.5;

мы получаем рабочую сцену на Google Nexus 5 и абсолютно нерабочую сцену на других устройствах типа Samsung Galaxy S3 или Galaxy Tab.