GLSL ES 2.0逆矩阵

8

在glsl es 2.0中,没有逆命令。
但我看到可以使用1.0/mat2。但我担心它只会明智地分割组件。是这样吗?
如果是这样的话,有什么技巧可以快速获得此内容(获取1/det)吗?

3个回答

7

在OpenGL ES 2.0中使用的GLSL ES 1.00中没有矩阵求逆函数。您需要手动计算,可以参考这里。但是您应该认真思考,是否真的需要每帧在着色器中基于每个顶点或每个片元进行计算,还是可以预先计算并作为uniform传入。


相信我,我在这方面真的很努力思考。顺便说一下,将行列式计算为点积会更快。 - tower120

1
为了补充Arttu Peltonen的回答,对于mat3,您可以使用以下inverse函数:
float det(mat2 matrix) {
    return matrix[0].x * matrix[1].y - matrix[0].y * matrix[1].x;
}

mat3 inverse(mat3 matrix) {
    vec3 row0 = matrix[0];
    vec3 row1 = matrix[1];
    vec3 row2 = matrix[2];

    vec3 minors0 = vec3(
        det(mat2(row1.y, row1.z, row2.y, row2.z)),
        det(mat2(row1.z, row1.x, row2.z, row2.x)),
        det(mat2(row1.x, row1.y, row2.x, row2.y))
    );
    vec3 minors1 = vec3(
        det(mat2(row2.y, row2.z, row0.y, row0.z)),
        det(mat2(row2.z, row2.x, row0.z, row0.x)),
        det(mat2(row2.x, row2.y, row0.x, row0.y))
    );
    vec3 minors2 = vec3(
        det(mat2(row0.y, row0.z, row1.y, row1.z)),
        det(mat2(row0.z, row0.x, row1.z, row1.x)),
        det(mat2(row0.x, row0.y, row1.x, row1.y))
    );

    mat3 adj = transpose(mat3(minors0, minors1, minors2));

    return (1.0 / dot(row0, minors0)) * adj;
}

0

我认为有一个错误。最好使用余子式矩阵:

float det(mat2 matrix) {
    return matrix[0].x * matrix[1].y - matrix[0].y * matrix[1].x;
}

mat3 inverse(mat3 matrix) {
    vec3 row0 = matrix[0];
    vec3 row1 = matrix[1];
    vec3 row2 = matrix[2];

    vec3 cof0 = vec3(
        det(mat2(row1.y, row1.z, row2.y, row2.z)),
        -det(mat2(row1.z, row1.x, row2.z, row2.x)),
        det(mat2(row1.x, row1.y, row2.x, row2.y))
    );
    vec3 cof1 = vec3(
        -det(mat2(row2.y, row2.z, row0.y, row0.z)),
        det(mat2(row2.z, row2.x, row0.z, row0.x)),
        -det(mat2(row2.x, row2.y, row0.x, row0.y))
    );
    vec3 cof2 = vec3(
        det(mat2(row0.y, row0.z, row1.y, row1.z)),
        -det(mat2(row0.z, row0.x, row1.z, row1.x)),
        det(mat2(row0.x, row0.y, row1.x, row1.y))
    );

    mat3 adj = transpose(mat3(cof0, cof1, cof2));

    return (1.0 / dot(row0, cof0)) * adj;
}

请检查。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接