2011-04-07 33 views
2

私はシンプル頂点シェーダー私のクライアントコードで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..1y=-1..1

シェーダで行列の乗算を行うと、すべてうまくいく。しかし、私が示したようなシェーダのコードをコメントアウトしてクライアント上で実行すると、奇妙な結果が得られます。それは同じ結果をもたらすはずですか?

gl_Positionの出力がvec4にもかかわらず2Dの座標であると誤解していませんか?

ありがとうございました。私は、頂点シェーダの出力が頂点位置に関して正確に何であるかを本当に理解したいと思います。

+0

projectin行列が実際にvec4の最後のコンポーネントを変更し、あなたがこの最後の値を無視しないことが重要です。 OpenGLは{x、y、z、w}から{x/w、y/w、z/w、1}にgl_Positionを変換します – Arne

答えて

3

問題は、位置の3つのコンポーネントだけを受け入れるので、シェーダーにあります。座標がまだ投影空間にない場合は、4番目の座標を1に設定しても構いません。

クライアント空間で変換を実行すると、結果は正しい4成分同型ベクトルになります。あなたはそれらをあなたの頂点シェーダでas isを使用する必要があります。

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

ありがとうございます。それは今働いている。また、レンダリングのパイプラインを読んで、視点の分割が起こっていることを理解しました。私の最初の読んでそれを逃したことがあります。 – Jeps

関連する問題