У меня есть вершинный шейдер, который умножает вершину на нормаль и после проецирует. Его задача - триангуляция линий. Нормали рассчитываются на CPU. Ширина линий задается u_width
#version 100
attribute vec4 a_position;
attribute vec2 a_normal;
uniform mat4 u_proj;;
uniform float u_width;
void main() {
vec4 delta = vec4(a_normal * u_width, 0, 0);
vec4 new_pos = a_position+delta;
gl_Position = u_proj*new_pos;
}
Результат работы на десктопе под windows, на андроид планшете с поддержкой opengl es 3.1, а также в браузере (webGL) - совершенно одинаков. Все работает как надо. Так выглядит результат. Получаются линии произвольной ширины.
Но (!) у меня есть андроид телефон (на базе intel Atom и opengl ES 2.0) и на нем все работает совершенно иначе. А именно: значение u_width не меняет толщину линии, а просто масштабирует все точки, делая линии длине, но не шире. На картинке ниже эта же тестовая сцена.
Совершенно аналогичного результата я могу добиться на десктопе, просто помасштаровав матрицу на число, равное ширине линии
matrix.scale(width,width,0);
, вместо того, чтобы умножать нормаль.
Получается что в на этом устройстве( телефоне на базе intel Atom ) значение u_width просто масштабирует матрицу. Но как? И почему? Может Qt что-то делает с моим шейдером во время компиляции приложения?