#opengl #glsl #vertex-shader
#opengl #glsl #вершинный шейдер
Вопрос:
У меня есть простой вершинный шейдер
#version 330 core
uniform mat4 projectionMatrix;
uniform mat4 viewMatrix;
uniform mat4 modelMatrix;
in vec3 in_Position;
out vec3 pass_Color;
void main(void)
{
//gl_Position = projectionMatrix * viewMatrix * modelMatrix * vec4(in_Position, 1.0);
gl_Position = vec4(in_Position, 1.0);
pass_Color = vec3(1,1,1);
}
В моем клиентском коде у меня есть
glm::vec4 vec1(-1,-1,0,1);//first
glm::vec4 vec2(0,1,0,1);//second
glm::vec4 vec3(1,-1,0,1);//third
glm::mat4 m = projectionMatrix * viewMatrix * modelMatrix;
//translate on client side
vec1 = m * vec1;
vec2 = m * vec2;
vec3 = m * vec3;
//first vertex
vertices[0] = vec1.x;
vertices[1] = vec1.y;
vertices[2] = vec1.z;
//second
vertices[3] = vec2.x;
vertices[4] = vec2.y;
vertices[5] = vec2.z;
//third
vertices[6] = vec3.x;
vertices[7] = vec3.y;
vertices[8] = vec3.z;
Теперь мой вопрос: если я не использую матричное умножение в шейдере и не использую его в клиентском коде, это отобразит мне красивый треугольник, который ограничивает весь экран, поэтому я полагаю, что карты вершинного шейдера привязывают его к экрану в системе координат с x=-1..1
и y=-1..1
Если я выполняю умножение матрицы в шейдере, все работает нормально. Но если я закомментирую код в шейдере, как показано, и сделаю это на клиенте, я получу странные результаты. Разве это не должно приводить к тому же результату?
Я ошибся, думая, что вывод вершинного шейдера gl_Position
имеет 2D-координаты, несмотря на то, что он является vec4
?
Спасибо за любую помощь. Мне действительно нравится понимать, что именно представляет собой вывод вершинного шейдера с точки зрения положения вершины.
Комментарии:
1. матрица projectin фактически изменяет последний компонент vec4, и важно, чтобы вы не игнорировали это последнее значение. opengl преобразует gl_Position из {x,y, z,w} в {x/w,y/w, z/w, 1}
Ответ №1:
Проблема в вашем шейдере, поскольку он принимает только 3 компонента position. Можно задать четвертой координате значение 1 (как вы это делаете), если координата еще не находится в пространстве проекции.
Когда вы выполняете преобразование в клиентском пространстве, результатом являются правильные 4-компонентные однородные векторы. Вам просто нужно использовать их as is
в вашем вершинном шейдере:
in vec4 in_Position.
...
gl_Position = in_Position.
Комментарии:
1. Спасибо. Теперь это работает. Также ознакомился с конвейером рендеринга и понял, как происходит разделение перспективы. Я пропустил это при первом прочтении.