GithubHelp home page GithubHelp logo

w0lramd / wgpu-matrix Goto Github PK

View Code? Open in Web Editor NEW

This project forked from greggman/wgpu-matrix

0.0 0.0 0.0 688 KB

Fast WebGPU 3d math library

License: MIT License

JavaScript 97.02% CSS 2.80% HTML 0.19%

wgpu-matrix's Introduction

wgpu-matrix

NPM Package

Fast 3d math library for webgpu

Usage

import {
  vec3,
  mat4,
} from 'https://wgpu-matrix.org/dist/0.x/wgpu-matrix.module.js';

const fov = 60 * Math.PI / 180
const aspect = width / height;
const near = 0.1;
const far = 1000;
const perspective = mat4.perspective(fov, aspect, near, far);

const eye = [3, 5, 10];
const target = [0, 4, 0];
const up = [0, 1, 0];
const camera = mat4.lookAt(eye, target, up);

const view = mat4.inverse(camera);

Note: for translation, rotation, and scaling there are 2 versions of each function. One generates a translation, rotation, or scaling matrix. The other translates, rotates, or scales a matrix.

const t = mat4.translation([1, 2, 3]);    // a translation matrix
const r = mat4.rotationX(Math.PI * 0.5);  // a rotation matrix
const s = mat4.scaling([1, 2, 3]);        // a scaling matrix
const m = mat4.identity();
const t = mat4.translate(m, [1, 2, 3]);    // m * translation([1, 2, 3])
const r = mat4.rotateX(m, Math.PI * 0.5);  // m * rotationX(Math.PI * 0.5)
const s = mat4.scale(m, [1, 2, 3]);        // m * scaling([1, 2, 3])

Functions take an optional destination to hold the result.

const m = mat4.identity();
mat4.translate(m, [1, 2, 3], m);    // m = m * translation([1, 2, 3])
mat4.rotateX(m, Math.PI * 0.5, m);  // m = m * rotationX(Math.PI * 0.5)
mat4.scale(m, [1, 2, 3], m);        // m = m * scaling([1, 2, 3])

There is also the minified version

import {
  vec3,
  mat4,
} from 'https://wgpu-matrix.org/dist/0.x/wgpu-matrix.module.min.js';

// ... etc ...

or via npm

npm install --save wgpu-matrix

then using a build process

import {vec3, mat3} from 'wgpu-matrix';

// ... etc ...

Example

Download

Notes

mat4.perspective, mat4.ortho, and mat4.frustum all return matrices with Z clip space from 0 to 1 (unlike most WebGL matrix libraries which return -1 to 1)

mat4.lookAt returns a matrix that makes an object look down the -Z axis. If you want a view matrix take its inverse.

Important!

mat3 uses the space of 12 elements

// a mat3
[
  xx, xy, xz, ?
  yx, yy, yz, ?
  zx, zy, zz, ?
]

This is because WebGPU requires mat3s to be in this format and since this library is for WebGPU it makes sense to match so you can manipulate mat3s in TypeArrays directly.

vec3 in this library uses 3 floats per but be aware that an array of vec3 in a Uniform Block or other structure in WGSL, each vec3 is padded to 4 floats! In other words, if you declare

struct Foo {
  bar: vec3<f32>[3];
};

then bar[0] is at byte offset 0, bar[1] at byte offset 16, bar[2] at byte offset 32.

See the WGSL spec on alignment and size.

Columns vs Rows

WebGPU follows the same conventions as OpenGL, Vulkan, Metal for matrices. Some people call this "column major". The issue is the columns of a traditional "math" matrix are stored as rows when declaring a matrix in code.

[
  x1, x2, x3, x4,  // <- column 0
  y1, y2, y3, y4,  // <- column 1
  z1, z2, z3, z4,  // <- column 2
  w1, w2, w3, w4,  // <- column 3
]

To put it another way, the translation vector is in elements 12, 13, 14

[
  xx, xy, xz, 0,  // <- x-axis
  yx, yy, yz, 0,  // <- y-axis
  zx, zy, zz, 0,  // <- z-axis
  tx, ty, tz, 1,  // <- translation
]

This issue has confused programmers since at least the early 90s ๐Ÿ˜Œ

Performance vs Convenience

Most functions take an optional destination as the last argument. If you don't supply it a new one (vector, matrix) will be created for you.

// convenient usage

const persp = mat4.perspective(fov, aspect, near, far);
const camera = mat4.target(eye, target, up);
const view = mat4.inverse(camera);
// performant usage

const persp = mat4.create();
const camera = mat4.create();
const view = mat4.create();

mat4.perspective(fov, aspect, near, far, persp);
mat4.target(eye, target, up, camera);
mat4.inverse(camera, view);

For me, most of the stuff I do in WebGPU, the supposed performance I might lose from using the convenient style is so small as to be unmeasurable. I'd prefer to stay convenient and then, if and only if I find a performance issue, then I might bother to switch to the performant style.

As the saying goes premature optimization is the root of all evil. ๐Ÿ˜‰

Development

git clone https://github.com/greggman/wgpu-matrix.git
cd wgpu-matrix
npm i
npm run build
npm test

You can run tests in the browser by starting a local server

npx servez

Now go to wherever your server serves pages. In the case of servez that's probably http://localhost:8080/test/.

By default the tests test the minified version. To test the source use src=true as in http://localhost:8080/test/?src=true.

To limit which tests are run use grep=<regex>. For example http://localhost:8080/test/?src=true&grep=mat3.*?translate runs only tests with mat3 followed by translate in the name of test.

License

MIT

wgpu-matrix's People

Contributors

greggman avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.