-
Notifications
You must be signed in to change notification settings - Fork 319
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Feature Request: Support for Matrix Inverse Function #4115
Comments
What should non-invertible matrices return? Presumably, this would use some kind of yet-to-be-standardized optional<> feature? |
transpose is extremely cheap (less than cheap, it"s often free!) while inverse is extremely expensive. The table linked is incorrect; it is supported by GLSL, and by extension, SPIR-V (OpMatrixInverse). It is not supported by HLSL or MSL due to its large cost. |
I suggest the return for that case might be a matrix having all entries set to zero, let"s call it "null matrix". All invertible matrices have a non-zero determinant: a null matrix has the determinant = 0, so it is fundamentally different from all invertible matrices and it is easy to detect. In this case, with the proposed definition, the result would be By the way, with the same rationale I also suggest the |
Is there prior art for this? |
For comparison: the docs for
|
rdar://113945650 is a feature request for an inverse function in MSL |
I don"t know. GLSL leaves it "undefined" (https://docs.gl/sl4/inverse), which is not very satisfactory. |
Casting my vote for this to be implemented. Sure, users could paste code that does it, but writing a correct, efficient, ~numerically stable inverse function is nontrivial. It would be good to have a "correct" implementation as part of the library. I"m not much moved by the objection that "it"s expensive". It"s the programmer"s job to decide whether calling the function is worth it in their application. I"d resent a language design for denying me an essential primitive because it thinks I can"t be trusted to optimize my own code. |
regardless of whether or not it gets added, if it was added it would likely not happen for quite a while. Browsers are still trying to ship version 1.0. In the meantime, feel free to post snippets here for solutions today. Here"s one (no idea what issues it has). fn inverse(m: mat4x4f) -> mat4x4f {
let a00 = m[0][0]; let a01 = m[0][1]; let a02 = m[0][2]; let a03 = m[0][3];
let a10 = m[1][0]; let a11 = m[1][1]; let a12 = m[1][2]; let a13 = m[1][3];
let a20 = m[2][0]; let a21 = m[2][1]; let a22 = m[2][2]; let a23 = m[2][3];
let a30 = m[3][0]; let a31 = m[3][1]; let a32 = m[3][2]; let a33 = m[3][3];
let b00 = a00 * a11 - a01 * a10;
let b01 = a00 * a12 - a02 * a10;
let b02 = a00 * a13 - a03 * a10;
let b03 = a01 * a12 - a02 * a11;
let b04 = a01 * a13 - a03 * a11;
let b05 = a02 * a13 - a03 * a12;
let b06 = a20 * a31 - a21 * a30;
let b07 = a20 * a32 - a22 * a30;
let b08 = a20 * a33 - a23 * a30;
let b09 = a21 * a32 - a22 * a31;
let b10 = a21 * a33 - a23 * a31;
let b11 = a22 * a33 - a23 * a32;
let det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;
return mat4x4f(
a11 * b11 - a12 * b10 + a13 * b09,
a02 * b10 - a01 * b11 - a03 * b09,
a31 * b05 - a32 * b04 + a33 * b03,
a22 * b04 - a21 * b05 - a23 * b03,
a12 * b08 - a10 * b11 - a13 * b07,
a00 * b11 - a02 * b08 + a03 * b07,
a32 * b02 - a30 * b05 - a33 * b01,
a20 * b05 - a22 * b02 + a23 * b01,
a10 * b10 - a11 * b08 + a13 * b06,
a01 * b08 - a00 * b10 - a03 * b06,
a30 * b04 - a31 * b02 + a33 * b00,
a21 * b02 - a20 * b04 - a23 * b00,
a11 * b07 - a10 * b09 - a12 * b06,
a00 * b09 - a01 * b07 + a02 * b06,
a31 * b01 - a30 * b03 - a32 * b00,
a20 * b03 - a21 * b01 + a22 * b00) * (1 / det);
} |
It would be great to consider having a builtin inverse() function for matrices in WGLS.
As pointed out in this comment, it is supported by other APIs.
While it has been argued that this function is potentially expensive and that they are other ways by which a user of the API could pass on the inverse of a given matrix to a shader (including writing your own function in a shader itself), it seems like having a built-in function could be super convenient at times:
Note that while these are very different functions, WGSL already supports
transpose()
. Many users will thus expect to also seeinverse()
supported.The text was updated successfully, but these errors were encountered: