Как вы реализуете glOrtho для opengles 2.0?С или без значений tx, ty, tz из спецификации glOrtho? - PullRequest
5 голосов
/ 20 августа 2011

Я пытаюсь реализовать свою собственную функцию glOtho из документации opengles http://www.khronos.org/opengles/documentation/opengles1_0/html/glOrtho.html
, чтобы изменить матрицу проекции в моем вершинном шейдере.Это в настоящее время не работает должным образом, поскольку я вижу мои простые вершины треугольников не на своем месте.Можете ли вы проверить код ниже и посмотреть, не делаю ли я что-то неправильно.

Я попытался установить 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);

}

Vert shader

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

Решение Из ответа Nicols ниже я модифицировал свою матрицу, так что она выглядела правильно

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

Важное примечание Вы не можете использовать GL_TRUE для аргумента транспонирования для glUniform, как показано ниже.opengles не поддерживает это.должно быть GL_FALSE

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

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

transpose Указывает, следует ли транспонировать матрицу при загрузке значений в единую переменную.Должно быть GL_FALSE.

1 Ответ

4 голосов
/ 20 августа 2011

Матрицы в OpenGL являются основными столбцами. Если вы не передадите GL_TRUE в качестве третьего параметра для glUniformMatrix4fv, матрица будет эффективно транспонирована относительно того, что вы намереваетесь.

...