2011-04-07 2 views
2

шейдер У меня есть простой вершинный шейдерOpenGL Vertex преобразование и вывод

#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 является двумерным каналом, несмотря на то, что он является vec4?

Спасибо за любую помощь. Мне очень нравится понимать, каков именно вывод вершинного шейдера в терминах вершинной позиции.

+0

матрица projectin фактически изменяет последнюю составляющую vec4 и очень важно, чтобы вы не игнорировать это последнее значение. opengl преобразует gl_Position из {x, y, z, w} в {x/w, y/w, z/w, 1} – Arne

ответ

3

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

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

in vec4 in_Position. 
... 
gl_Position = in_Position. 
+0

Спасибо. Теперь он работает. Также прочитал о трубопроводе рендеринга и понял, как происходит разделение перспективы. Пропустили это при первом прочтении. – Jeps