OpenGL ES 2D将NDC转换为屏幕坐标

时间:2014-12-28 22:22:23

标签: matrix vector opengl-es coordinates viewport

我使用OpenGL ES只绘制2D形状,我必须创建自己的矩阵并将它们传递给着色器。

我只使用3x3矩阵和2个分量矢量。我知道通常对于2D你仍然有4x4矩阵和3个分量向量,Z设置为1.但是我想知道我是否可以保持3x3。

我已经完成了所有矩阵的工作,翻译轮换和扩展所有工作。我所缺少的是一个"投影"矩阵,我的所有位置都在-1到1之间,我的形状变形,因为我的手机的宽高比不是1.我需要一个矩阵,用正确的比例将我的所有坐标映射到屏幕。

通常情况下,您使用正交投影矩阵进行此映射,但这些都是4x4。如何使用3x3矩阵进行映射?如果我没有办法保留矩阵3x3并以其他方式映射它? (我可以在没有矩阵的情况下插入坐标,但这不会解决比率问题)

为了澄清,这是我的顶点着色器,你可以看到我使用3x3变换矩阵和2个分量向量:

uniform mat3 u_transform_mat;   

attribute vec2 a_vert_pos;  
attribute vec2 a_vert_uv;     

varying vec2 v_vert_uv;       

void main()                 
{                           
   v_vert_uv = a_vert_uv;       

   gl_Position = vec4(u_transform_mat * vec3(a_vert_pos, 1.0), 1.0);
}                                 

1 个答案:

答案 0 :(得分:1)

在这种情况下,你所有的“投影”矩阵确实需要做的是缩放。

比方说,您有横向屏幕尺寸,纵横比为1.5。通过现在的变换,NDC范围[-1,1]将被拉伸以适应屏幕宽度,这意味着相对于垂直方向在水平方向上缩放了1.5倍。

要保持比例不变的是将x方向的范围[-1.5,1.5]和y方向的范围[-1,1]映射到屏幕。或者在更一般的情况下,[-aspect,aspect]在x方向上。

要将[-aspect,aspect]范围映射到[-1,1]的NDC范围,您需要将x坐标缩放(1 / aspect)。因此,您的“投影”矩阵是一个非均匀缩放矩阵,只能在x方向上缩放:

    [ 1.0f / aspectRatio  0.0f  0.0f ]
P = [        0.0f         1.0f  0.0f ]
    [        0.0f         0.0f  1.0f ]