Преобразование и вывод вершинного шейдера OpenGL - PullRequest
2 голосов
/ 07 апреля 2011

У меня есть простой вершинный шейдер

#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 Ответ

3 голосов
/ 07 апреля 2011

Проблема в вашем шейдере, так как он принимает только 3 компонента позиции. Можно установить четвертую координату равной 1 (как вы это делаете), если координата еще не находится в проекционном пространстве.

Когда вы выполняете преобразование в клиентском пространстве, результаты являются правильными 4-компонентными однородными векторами. Вам просто нужно использовать их as is в вашем вершинном шейдере:

in vec4 in_Position.
...
gl_Position = in_Position.
...