我使用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);
}
答案 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 ]