GLSL着色器中的翻译

时间:2015-11-19 15:09:32

标签: opengl glsl

我正在尝试在顶点GLSL着色器中移动图形:

layout(location = 0) in vec3 Position;
layout(location = 1) in vec3 offset;

uniform mat4 ProjectionViewMatrix;

void main()
{
    vec3 newPos = Position;
    newPos.x += offset[0];
    newPos.y += offset[1];
    //newPos.z += offset[2];

    mat4 translation;
    translation[0][0] = 1;
    translation[1][1] = 1;
    translation[2][2] = 1;
    translation[2][3] = offset[2];
    translation[3][3] = 1;

    gl_Position = ProjectionViewMatrix * (translation * vec4(newPos, 1.0));
}

我想用不同的坐标绘制许多类似的对象,所以我在vec3偏移中使用glDrawArraysInstanced和layout(location = 1); - 动态缓冲区;

使用翻译矩阵不起作用。但是,如果我将取消注释行newPos.z + = offset [2];并删除它可以工作的翻译矩阵。

我更喜欢使用矩阵,因为将来我想传递有关动态缩放的着色器信息。 为什么它不适用于矩阵?

1 个答案:

答案 0 :(得分:2)

GLSL使用以列主要顺序存储的矩阵运行。用你通常写的方式写出对应于矩阵的索引:

[0][0]  [1][0]  [2][0]  [3][0]
[0][1]  [1][1]  [2][1]  [3][1]
[0][2]  [1][2]  [2][2]  [3][2]
[0][3]  [1][3]  [2][3]  [3][3]

要在将此矩阵与右侧的列向量相乘时应用平移,翻译向量将进入最后一列的前3个元素,即索引对[3][0][3][1][3][2]。这意味着z偏移进入矩阵元素[3][2]