КАК МЫ ДЕЛАЕМ ЖИВЫЕ ОБОИ ДЛЯ ANDROID ИЗ ПЛАСТИЛИНА

Доброго времени суток! Мы хотим поделиться небольшим рассказом о том, как мы делаем оригинальные Живые обои для Android, созданные из пластилина.Plasticine_beach_1024x500

http://kolesov-mikhaylov.ru/2014/06/11/how-we-do-it/

Живые обои для Android. Как создать. Тонкости. Продвижение

Презентация доклада по моему хобби на UWDC 2014.

Фрагментация 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.