你如何编写一个转换顶点的GLSL顶点程序?

时间:2013-10-15 13:23:54

标签: glsl

......让它真正起作用。我得到了原理,你写了一个顶点程序,就像这样说:

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

我做错了什么?

1 个答案:

答案 0 :(得分:3)

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

您的矩阵实际上只会改变矢量的w分量,然后忽略该分量,因此它没有任何明显的效果。