0

...并让它真正起作用。我明白了原理,你写了一个顶点程序,比如,这样说:

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 平移操作;矩阵乘法似乎......什么都不做。

我究竟做错了什么?

4

1 回答 1

3

您的矩阵顺序错误。GLSL 使用列优先,因此初始化程序中的每一行都将成为矩阵的一列。这反映了与(现已弃用的)GL 矩阵堆栈一起使用的相同约定。这也与必须为列主要输入设置transpose的调用参数的设置一致(其中翻译部分是一维数组中的元素 m[12],m[13],m[14])。glUinformMatrix*()GL_FALSE

你的矩阵实际上只改变了你的向量的 w 分量,然后你会忽略它,所以它没有任何可见的效果。

于 2013-10-15T18:25:27.237 回答