...并让它真正起作用。我明白了原理,你写了一个顶点程序,比如,这样说:
attribute vec3 v_pos;
attribute vec4 v_color;
attribute vec2 v_uv;
attribute vec3 v_rotation; // [angle, x, y]
uniform mat4 modelview_mat;
uniform mat4 projection_mat;
varying vec4 frag_color;
varying vec2 uv_vec;
void main (void) {
mat4 trans_in = mat4(
1.0, 0.0, 0.0, 50.0, // <--- Transformation matrix
0.0, 1.0, 0.0, 50.0,
0.0, 0.0, 1.0, 50.0,
0.0, 0.0, 0.0, 1.0
);
vec4 pos = trans_in * vec4(v_pos,1.0); // <--- apply to input
// Mark a vertex using color to prove a transformation is actually happening...
if (v_rotation[0] > 10.0) {
frag_color = vec4(1.0, 0.0, 0.0, 1.0);
gl_Position = projection_mat * vec4(pos[0], pos[1], 1.0, 1.0);
}
// And leave all the other verticies untouched.
else {
frag_color = v_color;
gl_Position = projection_mat * vec4(v_pos, 1.0); // <--- Untransformed output
}
uv_vec = v_uv; // <--- Pass UV to fragment program
}
问题是,这实际上不起作用。
应用矩阵变换 trans_in * v_pos 后,我希望点 [1, 2, 3] 变为 [51, 52, 53, 1]。
...但事实并非如此。事实上,它呈现了这个:
(即点位置没有变换;pos = trans_in * v_pos == vec4(v_pos, 1.0)!!!!!! O_o)
注意红色标记的顶点,证明我实际上是在为它们设置 gl_Position;事实上,如果我这样做:
gl_Position = projection_mat * vec4(1.0, 1.0, 1.0, 1.0);
正如您所料,每个红点都会跳到底角。
我还尝试了各种 3x3 矩阵乘法,似乎虽然缩放操作有效,并且在某种程度上,旋转操作有效,但我终生无法运行任何 2d 平移操作;矩阵乘法似乎......什么都不做。
我究竟做错了什么?