我正在尝试在顶点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];并删除它可以工作的翻译矩阵。
我更喜欢使用矩阵,因为将来我想传递有关动态缩放的着色器信息。 为什么它不适用于矩阵?
答案 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]
。