美文网首页
OpenGL 透视矩阵

OpenGL 透视矩阵

作者: 再好一点点 | 来源:发表于2021-09-15 11:25 被阅读0次

    这篇文章是老早之前的了,以前在个人博客上边,现在搬过来。原文章地址

    这几天做文字渲染的时候需要用到一个旋转功能,就是需要对文字进行旋转。然后就开始写代码,一切准备就绪,开始运行,发现文字比例变形。于是就开始查找原因,然后就写了个demo来记录一下出错的原因。用的是opengl 3.0。

    顶点shader如下:

    #version 300 es
    
    layout(location=0) in vec4 a_position;
    layout(location=1) in vec2 a_texCoord;
    layout(location=2) in vec4 a_color;
    
    uniform mat4 a_mvp;
    
    out vec2 v_texCoord;
    out vec4 v_color;
    
    void main()
    {
        gl_Position = a_mvp * a_position;
        v_texCoord = a_texCoord;
        v_color = a_color;
    }
    

    片段shader如下:

    #version 300 es
    
    precision mediump float;
    
    in vec2 v_texCoord;
    in vec4 v_color;
    uniform sampler2D s_texture;
    out vec4 outColor;
    
    void main() {
        outColor = texture(s_texture, v_texCoord) * v_color;
    }
    

    顶点坐标如下:

    GLfloat vertices[] = {
        -0.5,  -0, 0.0f, 1, 1, 1, 1,
        0.5, -0, 0.0f, 1, 1, 1, 1,
        0,  1, 0.0f, 1, 1, 1, 1,
    };
    

    矩阵变换如下:

        float aspect = self.frame.size.width / self.frame.size.height;   
     ksMatrixLoadIdentity(&projectionMatrix);
        ksPerspective(&projectionMatrix, 0, aspect, 1.0f, 20.0f);
    
        ksMatrixLoadIdentity(&modelViewMatrix);
        ksMatrixRotate(&modelViewMatrix, _rotation * 180 / M_PI, 0.0, 0.0, 1.0);
    
        ksMatrixMultiply(&mvpMatrix, &modelViewMatrix, &projectionMatrix);
    
        GLuint mvp = glGetUniformLocation(shader.normalPrograme, "a_mvp");
        glUniformMatrix4fv(mvp, 1, GL_FALSE, (GLfloat*)&mvpMatrix.m[0][0]);
    

    然后运行结果却是错误的。

    旋转后 旋转前

    很明显,无论旋转前或者旋转后画面比例都是不对的。

    最后发现是 ksPerspective(&projectionMatrix, 0, aspect, 1.0f, 20.0f),存在问题,虽然可以显示出来,但是并没有达到透视视图的效果。正确的做法是要设置视角大小不可为0,一般60就好了。但是这样设置以后由于摄像机看向Z轴负方向,而我设置的近远平面分别为1、20,所以就看不到画面了,但是可以通过移动视图来解决。如下,向Z轴正方向移动到4,因为相机看向Z轴负方向,所以-4就是向Z轴正方向移动。然后运行就是正确的视图。代码如下:

    ksPerspective(&projectionMatrix, 60, aspect, 1.0f, 20.0f);
    ksMatrixTranslate(&projectionMatrix, 0, 0, -4.0);
    

    正确效果图如下:

    旋转后 旋转前

    相关文章

      网友评论

          本文标题:OpenGL 透视矩阵

          本文链接:https://www.haomeiwen.com/subject/gwxfgltx.html