Использование правильной системы координат в вершинном шейдере GLSL - PullRequest
5 голосов
/ 19 ноября 2011

Кажется, у меня любопытная проблема.Я настроил OpenGL так:

glViewport(0, 0, width, height);

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, width, height, 0, -width, width);

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

Очевидно, ширина и высота - это размер моего окна, равный 600 на 400. Внутри OpenGL все в порядке, я могу перемещаться по правильной системе координат.т.е. перевод на 200 ходов того, что рисуется на 200 пикселей.

Теперь, внутри моего вершинного шейдера, я не могу использовать ту же систему координат, я делаю как обычно:

vec4 pos  = gl_ModelViewProjectionMatrix * gl_Vertex;   
gl_Position = pos;

внутри main () и все вроде бы нормально.Однако, когда я пытаюсь что-то вроде этого:

vec4 pos  = gl_ModelViewProjectionMatrix * gl_Vertex;   
pos.x+= 1.0;
pos.y-= 1.0;
gl_Position = pos;

Позиции вершин переводятся не по 1 пикселю в каждом направлении, а по 300 в x и 200 в y.

Я понимаю, что могу масштабировать эти значения внутри шейдера, но это кажется немного грязным.Наверняка я что-то не так делаю в настройке.Любая помощь очень ценится.

Ответы [ 2 ]

11 голосов
/ 19 ноября 2011

Позиция, выводимая gl_Position, не является пространством экрана. Это пространство клипа. Клип пространство увеличивается от -1 до 1 в каждом направлении после подразумеваемого / w деления . glOrtho применяет преобразование к проекции, которое будет смещать / масштабировать координаты в диапазоне [0, 800] x [0,600] до [-1,1].

Преобразование в пиксели пространства экрана происходит через преобразование области просмотра. Это окно просмотра, которое связывает координаты NDC (это один маленький, но важный шаг после координат клипа) с размерами вашего окна. Проекция и не обязана зависеть от размеров области просмотра (конечно, если кто-то хочет разместить объекты по пикселям, то желательно использовать проекцию, которая отображает координаты пространства глаза на пространство пикселей экрана).

3 голосов
/ 19 ноября 2011

Вы применяете перевод [+1, -1] после преобразования.-1 <= x <= 1, -1 <= y <= 1 соответствуют краям области просмотра после этого преобразования, поэтому вы получаете приращения width / 2 и height / 2. </p>

...