glsl es 2.0逆矩阵

glsl es 2.0逆矩阵,glsl,glsles,Glsl,Glsles,glsl es 2.0中没有反向命令 但是我看到我可以1.0/mat2。但我担心它只会明智地划分组件。是否?但如果是这样,是否有一些技巧(快速获取1/det)?否,GLSL ES 1.00中没有矩阵求逆函数(用于OpenGL ES 2.0)。您需要手动执行此操作,请查看例如。但是,您应该仔细考虑是否真的需要在着色器中每帧逐顶点或逐片段执行此操作,或者是否可以预先计算并作为统一的方式传入。要添加到Arttu Peltonen的响应中,对于mat3,您可以使用以下反向函数: float det(ma

glsl es 2.0中没有反向命令

但是我看到我可以1.0/mat2。但我担心它只会明智地划分组件。是否?
但如果是这样,是否有一些技巧(快速获取1/det)?

否,GLSL ES 1.00中没有矩阵求逆函数(用于OpenGL ES 2.0)。您需要手动执行此操作,请查看例如。但是,您应该仔细考虑是否真的需要在着色器中每帧逐顶点或逐片段执行此操作,或者是否可以预先计算并作为统一的方式传入。

要添加到Arttu Peltonen的响应中,对于
mat3
,您可以使用以下
反向
函数:

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;
}

相信我,我想这件事真的很难。顺便说一下,用点积计算行列式更快。