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

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