OpenGL調節屏幕的寬高比

1.正交投影
投影線垂直於投影面的投影屬於正交投影 ,也稱爲平行投影。一般2D畫面採用這種投影方式。
2.orthoM(m, mOffset, left, right, bottom, top, near, far)方法
該方法會生成一個正交投影矩陣存儲在m數組變量中,這個矩陣會把所有在左右之間、上下之間和遠近之間的事物映射到歸一化設備座標中從-1到1的範圍,在這個範圍內的所有事物在屏幕上都是可見的(可想象成一個長方體)。
3.舉例

//頂點着色器/res/raw/simple_vertex_shader.glsl
//glUniformMatrix4fv方法設置u_Matrix的值
uniform mat4 u_Matrix;

attribute vec4 a_Position;
attribute vec4 a_Color;

varying vec4 v_Color;

void main()
{
    v_Color = a_Color;

    gl_Position = u_Matrix * a_Position;
    gl_PointSize = 10.0;
}
//MyRenderer類添加成員變量
private static final String U_MATRIX = "u_Matrix";
private int uMatrixLocation;
private final float[] projectionMatrix = new float[16];
//MyRenderer類onSurfaceCreated方法添加
//關聯着色器u_Matrix變量地址
uMatrixLocation = glGetUniformLocation(program, U_MATRIX);
//MyRenderer類onSurfaceChanged方法添加
//創建正交矩陣
final float aspectRatio = width>height?
    (float)width/(float)height :
    (float)height/(float)width;

if(width>height){
    //land
    orthoM(projectionMatrix, 0, -aspectRatio, aspectRatio, -1.0f, 1.0f, -1.0f, 1.0f);
} else {
    //prot or square
    orthoM(projectionMatrix, 0, -1.0f, 1.0f, -aspectRatio, aspectRatio,-1.0f, 1.0f);
}
System.out.println("aspectRatio: " + aspectRatio);
//MyRenderer類onDrawFrame方法添加
//正交投影矩陣傳值給着色器
glUniformMatrix4fv(uMatrixLocation, 1, false, projectionMatrix, 0);
//logcat結果
//豎屏
aspectRatio: 1.3583333
//橫屏
aspectRatio: 1.9977802

4.總結:由打印結果的可知,
顯示豎屏時,
左下角座標爲(-1,-1.3583333),
右下角座標爲( 1,-1.3583333),
右上角座標爲( 1, 1.3583333),
左上角座標爲(-1, 1.3583333);
顯示橫屏時,
左下角座標爲(-1.9977802,-1),
右下角座標爲( 1.9977802, 1),
右上角座標爲( 1.9977802,-1),
左上角座標爲(-1.9977802, 1);
經過正交投影矩陣處理後,採用視圖寬高(注意這裏是視圖寬高而不是屏幕寬高)小的作爲-1到1單位,然後以同比例變換大的寬高。
5.源碼:https://github.com/HQlin/ShaderOpenGL

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章