opengl GLSL着色器中的平移

vulvrdjw  于 2022-11-04  发布在  其他
关注(0)|答案(2)|浏览(234)

我正在尝试移动图形内部顶点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];并去掉平移矩阵,它就能工作。
我更喜欢使用矩阵,因为在未来我想在动态缩放的着色器信息传递。为什么它不与矩阵工作?

gstyhher

gstyhher1#

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]

fcg9iug3

fcg9iug32#

为了更清楚地说明,您似乎可以构建一个转换矩阵,如下所示:

mat4 BuildTranslation(vec3 delta)
{
    mat4 m;
    m[0][0] = 1;
    m[1][1] = 1;
    m[2][2] = 1;
    m[3] = vec4(delta, 1.0);
    return m;
}

this answer has another method

mat4 BuildTranslation(vec3 delta)
{
    return mat4(
        vec4(1.0, 0.0, 0.0, 0.0),
        vec4(0.0, 1.0, 0.0, 0.0),
        vec4(0.0, 0.0, 1.0, 0.0),
        vec4(delta, 1.0));
}

相关问题