Почему одинаковый GLSL код работает совершенно по-разному на разных устройствах?
У меня есть вершинный шейдер, который умножает вершину на нормаль и после проецирует. Очень простой.
Его задача - триангуляция линий. Нормали рассчитываются на CPU. Ширина линий задается u_width
#version 100
attribute vec2 a_position;
attribute vec2 a_normal;
uniform vec2 u_resolution;
uniform float u_width;
vec2 project (vec2 pos){
vec2 zeroToOne = pos/u_resolution;
vec2 zeroToTwo = zeroToOne * 2.0;
vec2 clipSpace = zeroToTwo - 1.0;
return (clipSpace)*vec2(1,-1);
}
"void main() {"
gl_Position = vec4(project(a_position+(a_normal*u_width)),0,1);
}
Результат работы на десктопе под windows, и на андроид планшете с поддержкой opengl es 3.1 - совершенно одинаков. Все работает как надо. Так выглядит результат.

Но (!) у меня есть андроид телефон (на базе intel Atom и opengl ES 2.0) и на нем все работает совершенно иначе. А именно: значение u_width не меняет толщину линии, а просто масштабирует все точки, делая линии длине, но не шире. Очень похоже, что попросту игнорируется порядок операций, а также скобки. И он сначала прибавляет нормаль, а затем все это уже умножает на u_width. Хотя этого быть ну никак не должно, ведь и порядок действий не позволяет этого делать, и тем более скобки, которые там даже излишни.
project(a_position+(a_normal*u_width))
Но даже если умножу нормаль заранее, ничего не изменится. Я вообще не понимаю как это возможно.
vec2 delta = a_normal*u_width;
gl_Position = vec4(project(a_position+delta),0,1);
