OpenGL 透视矩阵

2021-09-15  本文已影响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);

正确效果图如下:

旋转后 旋转前
上一篇 下一篇

猜你喜欢

热点阅读