【发布时间】:2014-12-26 20:39:32
【问题描述】:
我使用 OpenGL ES 2.0 仅渲染 2D 形状,因为它是 OpenGL ES 2.0,我必须创建自己的转换矩阵。
仅作为 2D 形状,我想将我的所有矩阵保持为 3x3,而我的向量只有 2 个坐标。
我还需要一个投影矩阵,因为我想将我的坐标映射到屏幕上,我不想从 [-1.0; 指定位置; 1.0]。
据我所知,人们仍然使用 4x4 矩阵来表示 2D 和 z 设置为 1 的向量,以及正交投影矩阵。
我的问题是:如何仅使用 3x3 矩阵进行所有转换和投影?我已经设置了投影矩阵,但翻译不起作用。
到目前为止,我已经完成了这样的翻译矩阵:
m[0][0] = 1; m[0][1] = 0; m[0][2] = tx;
m[1][0] = 0; m[1][2] = 1; m[1][2] = ty;
m[2][0] = 0; m[2][3] = 0; m[2][2] = 1;
据我所知,即使使用 NDC 坐标,这应该可以工作,当乘以向量时,它应该会导致
x+tx y+ty 1.0
但是当我尝试用 tx = 2f 平移这个从 -1 到 1 的三角形时,它会被压扁并且不会移动。
翻译前:
翻译后:
这里是我如何绘制三角形的参考:
GLES20.glUniformMatrix3fv(shader.GetUniform("u_transform_mat"), 1, false, Transform.GetTransformationMatrix().ToFloatBuffer());
GLES20.glEnableVertexAttribArray(shader.GetAttribute("a_vert_position"));
GLES20.glEnableVertexAttribArray(shader.GetAttribute("a_vert_color"));
GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, VBO[0]);
GLES20.glVertexAttribPointer(shader.GetAttribute("a_vert_position"), 2, GLES20.GL_FLOAT, false, Vertex.SIZE, 0);
GLES20.glVertexAttribPointer(shader.GetAttribute("a_vert_color"), 4, GLES20.GL_FLOAT, false, Vertex.SIZE, Vertex.POS_SIZE);
GLES20.glBindBuffer(GLES20.GL_ELEMENT_ARRAY_BUFFER, IBO[0]);
GLES20.glDrawElements(primitive, size, GLES20.GL_UNSIGNED_INT, 0);
GLES20.glDisableVertexAttribArray(shader.GetAttribute("a_vert_color"));
GLES20.glDisableVertexAttribArray(shader.GetAttribute("a_vert_position"));
还有我的顶点着色器
uniform mat3 u_transform_mat;
attribute vec3 a_vert_position;
attribute vec4 a_vert_color;
varying vec4 v_vert_color;
void main()
{
v_vert_color = a_vert_color;
gl_Position = vec4(u_transform_mat * a_vert_position, 1.0);
}
【问题讨论】:
标签: matrix vector opengl-es transformation projection