這篇文章是老早之前的了,以前在個人博客上邊,現(xiàn)在搬過來。原文章地址
這幾天做文字渲染的時候需要用到一個旋轉(zhuǎn)功能,就是需要對文字進行旋轉(zhuǎn)。然后就開始寫代碼,一切準(zhǔn)備就緒,開始運行,發(fā)現(xiàn)文字比例變形。于是就開始查找原因,然后就寫了個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;
}
頂點坐標(biāo)如下:
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]);
然后運行結(jié)果卻是錯誤的。

旋轉(zhuǎn)后

旋轉(zhuǎn)前
很明顯,無論旋轉(zhuǎn)前或者旋轉(zhuǎn)后畫面比例都是不對的。
最后發(fā)現(xiàn)是 ksPerspective(&projectionMatrix, 0, aspect, 1.0f, 20.0f),存在問題,雖然可以顯示出來,但是并沒有達到透視視圖的效果。正確的做法是要設(shè)置視角大小不可為0,一般60就好了。但是這樣設(shè)置以后由于攝像機看向Z軸負(fù)方向,而我設(shè)置的近遠(yuǎn)平面分別為1、20,所以就看不到畫面了,但是可以通過移動視圖來解決。如下,向Z軸正方向移動到4,因為相機看向Z軸負(fù)方向,所以-4就是向Z軸正方向移動。然后運行就是正確的視圖。代碼如下:
ksPerspective(&projectionMatrix, 60, aspect, 1.0f, 20.0f);
ksMatrixTranslate(&projectionMatrix, 0, 0, -4.0);
正確效果圖如下:

旋轉(zhuǎn)后

旋轉(zhuǎn)前