私はシンプル頂点シェーダー私のクライアントコードでOpenGLの頂点シェーダ変換して出力
#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;
を持っていますクライアントコードこれは私に、画面全体をstrectchする良い三角形をレンダリングするので、頂点シェーダは、与えられた座標系の画面上の座標をx=-1..1
とy=-1..1
シェーダで行列の乗算を行うと、すべてうまくいく。しかし、私が示したようなシェーダのコードをコメントアウトしてクライアント上で実行すると、奇妙な結果が得られます。それは同じ結果をもたらすはずですか?
gl_Position
の出力がvec4
にもかかわらず2Dの座標であると誤解していませんか?
ありがとうございました。私は、頂点シェーダの出力が頂点位置に関して正確に何であるかを本当に理解したいと思います。
projectin行列が実際にvec4の最後のコンポーネントを変更し、あなたがこの最後の値を無視しないことが重要です。 OpenGLは{x、y、z、w}から{x/w、y/w、z/w、1}にgl_Positionを変換します – Arne