The motivation behind this library and more in-depth information about the rendering techniques utilised can be found in my thesis.
If you're planning on creating animated content, use the runAnimation function to spare yourself from writing boilerplate code. Further documentation on its usage is available in its documentation.
IƱigo Quilez has some great 2D SDF-s
descriptor
of type DrawableDescriptorsThe vec2
, vec3
, and vec4
types seen in the documentation come from the glMatrix library and are equivalent to regular JS Arrays or Float32Arrays. So, feel free to give [x, y]
as an input for functions requiring vec2
.
Anywhere, where positions need to be specified, the y
values grow upwards. That means, when setting the view area, the origin is at the bottom left corner of the display.
For optimising the evaluation of the distance field, the display is divided up into a grid of tiles. The shaders for each tile are compiled to support a fix maximum number of objects on it. When using the built-in drawables it is possible that after a certain number of on-screen objects new ones won't be visible.
Mitigating this issue is quite easy. Instead of the following code:
this.renderer = await compile(canvas, [Circle.descriptor, CircleLight.descriptor]);
Modify it to something similar:
this.renderer = await compile(canvas, [
{
...Circle.descriptor,
shaderCombinationSteps: [0, 1, 2, 24, 64],
},
{
...CircleLight.descriptor,
shaderCombinationSteps: [0, 1, 2, 4],
},
]);
The usage of too large numbers is not advised for compatibility and performance reasons alike.
Steps are very useful for tile-based rendering, because it is possible for one tile (at a given moment) to be empty or contain just a few objects, while others have a large cluster of objects. The compiled shaders only take into account the necessary number of objects on each tile.