2011-08-20 15 views
5

Próbuję zaimplementować moją własną funkcję glOtho z dokumentacji opengles http://www.khronos.org/opengles/documentation/opengles1_0/html/glOrtho.html
w celu zmodyfikowania macierzy projekcyjnej w moim procesorze vertex. Obecnie nie działa poprawnie, ponieważ moje proste trójkąty są nie na miejscu. Czy możesz sprawdzić poniższy kod i sprawdzić, czy robię coś źle.Jak zaimplementować glOrtho dla opengles 2.0? Z wartościami tx, ty, tz lub bez nich z specyfikacji glOrtho?

Próbowałem ustawić tx, ty i tz na 0 i wydaje się, że renderuje się prawidłowo. Jakieś pomysły, dlaczego tak się stało?

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); 

} 

Vert shader

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

Rozwiązanie Od Nicols odpowiedzi poniżej I zmodyfikowaliśmy moją matrycę jak tak i wydawało czynią właściwie

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

Ważna uwaga Nie można używać GL_TRUE dla argumentu transpozycji dla glUniform as poniżej. opengles go nie obsługuje. musi być GL_FALSE

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

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

transpozycji określenie, czy transpozycję macierzy, gdy wartości są ładowane do zmiennej jednolite. Musi to być GL_FALSE.

Odpowiedz

4

Matryce w OpenGL są kolumną główną. Dopóki parametr GL_TRUE nie zostanie przekazany jako trzeci parametr glUniformMatrix4fv, macierz będzie skutecznie transponowana w stosunku do zamierzonego celu.

+0

dzięki. teraz pamiętam, że słyszałem to kiedyś w uni =). ustawienie GL_TRUE nie działało, ale przeniesienie wartości tx, ty, tz do dolnej części matrycy spowodowało, że – valmo

+0

Modyfikacja macierzy automatycznej transpozycji nie jest obsługiwana w OpenGL ES 2.0 - musisz [zawsze przekazać GL_FALSE] (https: //www.khronos. org/opengles/sdk/docs/man/xhtml/glUniform.xml) jako parametr transpozycyjny funkcji glUniformMatrix. –

Powiązane problemy