Геометрический шейдер и экранные координаты
От: ylem  
Дата: 28.09.18 20:48
Оценка:
Учебник читать очень некогда, но очень нужно написать геометрический шейдер.
В шейдере нужно получить и использовать "перпендикуляр в плоскости экрана" к отрезку.

Делаю так:
vec2 pt1 = vec2(gl_in[0].gl_Position.x, gl_in[0].gl_Position.y);
vec2 pt2 = vec2(gl_in[1].gl_Position.x, gl_in[1].gl_Position.y);

vec2 dir = normalize(pt2 - pt1);
vec2 normal = vec2(-dir.y, dir.x);


Нормаль "в координатах шейдера" получается, на экране -- нет, потому что координаты шейдера [-1..+1, -1..+1] а Viewport не квадратный.

Подскажите, пожалуйста, где у меня главное недопонимаение?
Как правильно получить "визуальный на экране" перепендикуляр?
Заранее большое спасибо.

Проекция ортографическая:
GL.MatrixMode(MatrixMode.Projection);
GL.LoadIdentity();
GL.Ortho(0, w, 0, h, -1, 1);
GL.Viewport(0, 0, (int)w, (int)h);

это OpenTK, w и h -- размеры вьюпорта на экране.

Если важно, в шейдер юниформом передаются размер Viewport в пикселях. По задумке для того, чтобы полизвести некоторые построения определенных пиксельных размеров.

UPD:
Перевожу в экранные координаты, манипулирую, перевожу обратно, работает.

Вопрос:
может быть у меня неудачно "настроена прокция"? Может быть можно было бы как-нибудь, чтобы даже с неквадратным Viewport масштабы по экранным X и Y совпадали?

В вершинном шейдере делаю
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
Отредактировано 30.09.2018 9:49 ylem . Предыдущая версия . Еще …
Отредактировано 29.09.2018 16:17 ylem . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.