шейдер У меня есть простой вершинный шейдер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
?
Спасибо за любую помощь. Мне очень нравится понимать, каков именно вывод вершинного шейдера в терминах вершинной позиции.
матрица projectin фактически изменяет последнюю составляющую vec4 и очень важно, чтобы вы не игнорировать это последнее значение. opengl преобразует gl_Position из {x, y, z, w} в {x/w, y/w, z/w, 1} – Arne