Задать вопрос
@black_list_man

Почему вершинный шейдер работает совершенно по-разному на разных устройствах?

У меня есть вершинный шейдер, который умножает вершину на нормаль и после проецирует. Его задача - триангуляция линий. Нормали рассчитываются на 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) - совершенно одинаков. Все работает как надо. Так выглядит результат. Получаются линии произвольной ширины.
5ffd648c05f82821115165.png

Но (!) у меня есть андроид телефон (на базе intel Atom и opengl ES 2.0) и на нем все работает совершенно иначе. А именно: значение u_width не меняет толщину линии, а просто масштабирует все точки, делая линии длине, но не шире. На картинке ниже эта же тестовая сцена.
5ffd64c200af7322517483.png
Совершенно аналогичного результата я могу добиться на десктопе, просто помасштаровав матрицу на число, равное ширине линии matrix.scale(width,width,0);, вместо того, чтобы умножать нормаль.
Получается что в на этом устройстве( телефоне на базе intel Atom ) значение u_width просто масштабирует матрицу. Но как? И почему? Может Qt что-то делает с моим шейдером во время компиляции приложения?
  • Вопрос задан
  • 77 просмотров
Подписаться 1 Сложный 1 комментарий
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы