Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/nathsou/suzanne

Dependency-free 3D Software Renderer
https://github.com/nathsou/suzanne

Last synced: about 2 months ago
JSON representation

Dependency-free 3D Software Renderer

Awesome Lists containing this project

README

        

# Suzanne 🐒 - Dependency-free 3D Software Renderer

![Wooden Suzanne](res/wooden_suzanne.png)

[See demos](https://github.com/nathsou/SuzanneDemos/)

## Features 🐵

- Programmable Vertex and Fragment shaders
- Perspective correct varying interpolation
- Texture mapping
- OBJ model loader
- API similar to WebGL
- Works in the browser and node.js
- Provides TypeScript type declarations

## Use cases 🙈

- Server-side 3D rendering
- Set your CPU on 🔥

## Todo 🙊

- [ ] Implement clipping
- [ ] Support .mtl files
- [ ] Improve performance
- [ ] Antialiasing
- [ ] Mipmapping

# Usage 🍌

```bash
npm install suzanne
```

## Importing

### Node.js

```javascript
const suz = require('suzanne');
```

### Browser

```html

```

### Webpack, Parcel...

```javascript
import { Context, VertexArray, ... } from 'suzanne';
```

### Basic example

To draw something, a new Context must be created

Suzanne internally stores pixel data in a Uint8ClampedArray in RGBA

```javascript
const sz = new suz.Context(400, 300, {
draw: bitmap => {
// draw bitmap (to a file or in an html canvas)
}
});

const triangle = {
vertices: [
suz.vec3(-1, -1, 2),
suz.vec3(1, -1, 2),
suz.vec3(0, 1, 2)
],
indices: new Uint8Array([0, 1, 2]),
attributes: {
color: [ //suz.colors are just suz.vec4 instances
suz.colors.red,
suz.colors.green,
suz.colors.blue
]
}
};

// create a Vertex Array Object from our triangle
const VAO = suz.VertexArray.fromModel(triangle);

// Use a perspective projection matrix to transform the triangle's vertices
const proj = suz.Matrix4.perspective(suz.radians(70), sz.width / sz.height, 0.1, 1000);

// declare a uniform variable (accessible from both shaders)
VAO.setUniform('mvp', proj);

// Attach shaders to our Canvas3D
sz.useProgram({
vertex_shader: vertex => {
// interpolate the color attribute
vertex.varyings.color = vertex.attributes.color;

// return our transformed vertex position
return vertex.uniforms.mvp.transform(vertex.position);
},
fragment_shader: (varyings, uniforms) => {
return varyings.color;
}
});

// bind our VAO to our Canvas3D
sz.bindVertexArray(VAO);

// clear the canvas to black
sz.clear(suz.colors.black);

// draw the triangle in indexed mode
sz.drawElements(suz.DrawingMode.TRIANGLES, 0, triangle.indices.length);

// update the canvas
sz.draw();
```

### Result - A magnificent colored triangle 🔻

![Colored triangle](res/tri.png)

### Going further

[https://github.com/nathsou/SuzanneDemos/](https://github.com/nathsou/SuzanneDemos/)