2011-08-20 29 views
5

我試着從opengles文檔http://www.khronos.org/opengles/documentation/opengles1_0/html/glOrtho.html
實現自己的glOtho功能在我的頂點着色器來修改投影矩陣。它目前不能正常工作,因爲我看到我的簡單三角形頂點不合適。你可以請檢查下面的代碼,看看我是否做錯了。如何爲opengles 2.0實現glOrtho?有或沒有來自glOrtho規範的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; 
} 

解決方案 從尼科耳回答下面我體改我的矩陣因此,它似乎呈現正常

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

重要提示 不能使用GL_TRUE用於glUniform as的轉置參數下面。 opengles不支持它。它必須是GL_FALSE

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

http://www.khronos.org/opengles/sdk/docs/man/xhtml/glUniform.xml

移調 指定是否轉置矩陣作爲值被加載到均勻的變量。必須是GL_FALSE。

回答

4

OpenGL中的矩陣是列主要的。除非您將GL_TRUE作爲第三個參數傳遞給glUniformMatrix4fv,否則矩陣將相對於您的意圖進行有效轉置。

+0

謝謝。我現在還記得曾經在uni =)聽過。設置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函數的轉置參數。 –