......让它真正起作用。我得到了原理,你写了一个顶点程序,就像这样说:
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翻译操作运行;矩阵乘法似乎......什么都不做。
我做错了什么?
答案 0 :(得分:3)
你的矩阵顺序错了。 GLSL使用列主要的oder,因此初始化器中的每一行都将成为矩阵的一列。这反映了与(现已弃用的)GL矩阵堆栈一起使用的相同约定。对于transpose
调用的glUinformMatrix*()
参数的设置也是一致的,对于列主要输入,必须将其设置为GL_FALSE
(其中平移部分是元素m [12],m [ 13],m [14]在一维数组中。
您的矩阵实际上只会改变矢量的w分量,然后忽略该分量,因此它没有任何明显的效果。