我正在尝试移动图形内部顶点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));
}
我想用不同的坐标绘制许多相似的对象,所以我使用glDrawArraysInstanced和layout(location = 1)在vec 3中偏移;动态缓冲器;
对于平移矩阵,它不起作用。但如果我将取消注解行newPos.z += offset[2];并去掉平移矩阵,它就能工作。
我更喜欢使用矩阵,因为在未来我想在动态缩放的着色器信息传递。为什么它不与矩阵工作?
2条答案
按热度按时间gstyhher1#
GLSL操作以列为主顺序存储的矩阵。只按照通常的写法编写与矩阵对应的索引:
为了在将该矩阵与右侧的列向量相乘时应用平移,平移向量进入最后一列的前3个元素,它们是索引对
[3][0]
、[3][1]
和[3][2]
。这意味着z偏移进入矩阵元素[3][2]
。fcg9iug32#
为了更清楚地说明,您似乎可以构建一个转换矩阵,如下所示:
或this answer has another method: