Учебник читать очень некогда, но очень нужно написать геометрический шейдер.
В шейдере нужно получить и использовать "перпендикуляр в плоскости экрана" к отрезку.
Делаю так:
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;