2011-08-20 6 views
5

私は自分のglOtho関数をopenglesから実装しようとしています。http://www.khronos.org/opengles/documentation/opengles1_0/html/glOrtho.html
頂点シェーダの投影行列を変更するには私は単純な三角形の頂点が外れているので、現在は正しく動作していません。下のコードをチェックして、間違っているかどうか確認してください。opengles 2.0用のglOrthoはどのように実装していますか? glOrtho specからのtx、ty、tz値の有無にかかわらず?

tx、ty、tzを0に設定しようとしましたが、正しくレンダリングされているようです。それがなぜそうなのでしょうか?

void ES2Renderer::_applyOrtho(float left, float right,float bottom, float top,float near, float far) const{ 

     float a = 2.0f/(right - left); 
     float b = 2.0f/(top - bottom); 
     float c = -2.0f/(far - near); 

     float tx = - (right + left)/(right - left); 
     float ty = - (top + bottom)/(top - bottom); 
     float tz = - (far + near)/(far - near); 

     float ortho[16] = { 
      a, 0, 0, tx, 
      0, b, 0, ty, 
      0, 0, c, tz, 
      0, 0, 0, 1 
     }; 


     GLint projectionUniform = glGetUniformLocation(_shaderProgram, "Projection"); 
     glUniformMatrix4fv(projectionUniform, 1, 0, &ortho[0]); 

} 

void ES2Renderer::_renderScene()const{ 
    GLfloat vVertices[] = { 
     0.0f, 5.0f, 0.0f, 
     -5.0f, -5.0f, 0.0f, 
     5.0f, -5.0f, 0.0f}; 

    GLuint positionAttribute = glGetAttribLocation(_shaderProgram, "Position"); 

    glEnableVertexAttribArray(positionAttribute); 


    glVertexAttribPointer(positionAttribute, 3, GL_FLOAT, GL_FALSE, 0, vVertices); 
    glDrawArrays(GL_TRIANGLES, 0, 3);  


    glDisableVertexAttribArray(positionAttribute); 

} 

ヴェールシェーダ

attribute vec4 Position; 
uniform mat4 Projection; 
void main(void){ 
    gl_Position = Projection*Position; 
} 

ソリューション ニコルから私はので、私の行列をmodifedし、適切にあなたが使用することはできません

float ortho[16] = { 
    a, 0, 0, 0, 
    0, b, 0, 0, 
    0, 0, c, 0, 
    tx, ty, tz, 1 
}; 

重要な注意 をレンダリングするように見えたの下に答えますglUniformの転置引数のGL_TRUE以下。 openglesはサポートしていません。それは転置 の値が均一な変数にロードされるように行列を転置するかどうかを指定http://www.khronos.org/opengles/sdk/docs/man/xhtml/glUniform.xml

からGL_FALSE

glUniformMatrix4fv(projectionUniform, 1, GL_TRUE, &ortho[0]); 

なければなりません。 GL_FALSEでなければなりません。

答えて

4

OpenGLの行列は列の長さです。 glUniformMatrix4fvの3番目のパラメータとしてGL_TRUEを渡さない限り、行列は意図したものに対して効果的に転置されます。

+0

ありがとうございました。一度ユニ=で聞いて覚えています)。 GL_TRUEを設定しても動作しませんでしたが、tx、ty、tzの値をマトリックスの一番下まで移動させると、 – valmo

+0

OpenGL ES 2.0では自動移送マトリックスユニフォームはサポートされていませんでした - 常に[GL_FALSE]を渡す必要があります(https://www.khronos。 org/opengles/sdk/docs/man/xhtml/glUniform.xml)をglUniformMatrix関数の転置パラメータとして使用します。 –

関連する問題