OpenGL 透視矩陣

這篇文章是老早之前的了,以前在個人博客上邊,現(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)前
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容