这篇文章是老早之前的了,以前在个人博客上边,现在搬过来。原文章地址
这几天做文字渲染的时候需要用到一个旋转功能,就是需要对文字进行旋转。然后就开始写代码,一切准备就绪,开始运行,发现文字比例变形。于是就开始查找原因,然后就写了个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);
正确效果图如下:
旋转后 旋转前
网友评论