【问题标题】:How do you implement glOrtho for opengles 2.0? With or without tx,ty,tz values from the glOrtho spec?你如何为 opengles 2.0 实现 glOrtho?有或没有 glOrtho 规范中的 tx,ty,tz 值?
【发布时间】:2011-08-21 08:25:14
【问题描述】:

我正在尝试从 opengles 文档http://www.khronos.org/opengles/documentation/opengles1_0/html/glOrtho.html实现我自己的 glOtho 函数@
在我的顶点着色器中修改投影矩阵。它目前无法正常工作,因为我看到我的简单三角形顶点不合适。你能检查下面的代码,看看我做错了吗。

我已尝试将 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;
}

解决方案 从下面的 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]);

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

转置 指定是否在将值加载到统一变量时转置矩阵。必须为 GL_FALSE。

【问题讨论】:

    标签: iphone opengl-es opengl-es-2.0


    【解决方案1】:

    OpenGL 中的矩阵主要是列。除非您将 GL_TRUE 作为第三个参数传递给 glUniformMatrix4fv,否则矩阵将有效地相对于您的意图进行转置。

    【讨论】:

    • 谢谢。我现在记得在大学听过一次=)。设置 GL_TRUE 无效,但将 tx,ty,tz 值移动到矩阵底部
    • OpenGL ES 2.0 不支持自动转置矩阵制服 - 您必须将 always pass GL_FALSE 作为 glUniformMatrix 函数的转置参数。
    猜你喜欢
    • 2015-07-04
    • 2019-08-17
    • 2011-02-20
    • 2013-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多