Преобразование и вывод вершинного шейдера OpenGL

#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. Спасибо. Теперь это работает. Также ознакомился с конвейером рендеринга и понял, как происходит разделение перспективы. Я пропустил это при первом прочтении.