0.9.0 • Published 8 months ago

glii v0.9.0

Weekly downloads
172
License
GPLv3
Repository
gitlab
Last release
8 months ago

GLII

GLII is a WebGL javascript abstraction library.

GLII is opinionated, and built from scratch with some specific design goals in mind:

  • Understandability: WebGL concepts are infamously hard to grasp; Glii renames some data structures and tries to make low-level data structures approachable.

  • Object-oriented API: OOP first. Glii does wrappers, inheritance, closures and factories, but does not favour MVC nor reactive frameworks.

  • Implicit context: Instead of dragging around an instance of WebGLRenderingContext around, Glii wraps around it with closures. Context handling is always implicit.

  • Avoid duplication: Names (of attributes, uniforms, varyings, etc) should never be defined twice. Glii forces them to be defined just once.

  • Do not assume 3D: Since Glii is low-level, no 3D scene is assumed.

  • No bundling: Glii is ESM native, framework-free. There is no transpilation step: no webpack, no babel, no rollupJS. Stuff works directly on any browsers that implement javascript modules.

Note from the author

The aforementioned design goals are opinionated, and they're the ones I like, since there are lots of things I don't like about the design of other WebGL frameworks. Your preferences and requisites might not be the same as my preferences and requisites, and that's fine.

I shall not try to convince people that Glii is the solution to every problem, but do consider your constraints when choosing a WebGL framework.

Hello, world

The shortest code to do something with Glii is drawing a single vertex with the following HTML code. Note there is no bundling whatsoever.

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8" />
	</head>
	<body>
		<canvas height="500" width="500" id="glii-canvas"> </canvas>
		<script type="importmap">
			{
				"imports": {
					"glii/": "https://unpkg.com/glii/src/"
				}
			}
		</script>
		<script type="module">
			// Point to wherever the entry point of Glii is. In this example
			// it comes from the unpkg CDN by means of the importmap defined above.
			import Glii from "glii/index.mjs";

			// Create the Glii factory. This shall wrap the context.
			const glii = new Glii(document.getElementById("glii-canvas"));

			const program = new glii.WebGL1Program({
				// The vertex shader runs only once, so it's OK to make gl_Position
				// constant at the clipspace center (0,0).
				// Since the draw mode is POINTS, gl_PointSize makes things easier to see.
				vertexShaderSource: `
void main() {
	gl_Position = vec4(0., 0., 0., 1.);
	gl_PointSize = 50.;
}`,
				// The vertex shader doesn't need to pass any data to the
				// fragment shader, so there are no varyings.
				varyings: {},

				// The fragment shader abuses the gl_PointCoord built-in variable
				// to give a bit of colour.
				fragmentShaderSource: `
void main() {
	gl_FragColor = vec4(gl_PointCoord ,0.,1.);
}`,

				// The indexBuffer tells the program how many vertices
				// there are (1) and how to interpret them (e.g. points, not triangles)
				indexBuffer: new glii.SequentialIndices({
					drawMode: glii.POINTS,
					size: 1,
				}),

				// This minimal program doesn't define any attributes,
				// textures nor uniforms.
				attributes: {},
				textures: {},
				uniforms: {},
			});

			// The program does not run automagically, and there's no implicit render loop.
			program.run();
		</script>
	</body>
</html>

And for those people who are non big fans of readability and like to measure things by the least lines of comment-stripped code:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8" />
	</head>
	<body>
		<canvas height="500" width="500" id="glii-canvas"> </canvas>
		<script type="importmap"> { "imports": { "glii/": "https://unpkg.com/glii/src/" } } </script>
		<script type="module">
			import Glii from "glii/index.mjs";
			const glii = new Glii(document.getElementById("glii-canvas"));
			const program = new glii.WebGL1Program({
				vertexShaderSource: `void main() { gl_Position = vec4(0., 0., 0., 1.); gl_PointSize = 50.; }`,
				fragmentShaderSource: ` void main() { gl_FragColor = vec4(gl_PointCoord ,0.,1.); }`,
				indexBuffer: new glii.SequentialIndices({
					drawMode: glii.POINTS,
					size: 1,
				}),
			});
			program.run();
		</script>
	</body>
</html>

Legalese

© Iván Sánchez Ortega ivan@sanchezortega.es, 2021.

Licensed under GPLv3. Yup. Complete text in the LICENSE file.

This repository holds 3rd-party libraries and images - see the contents of the 3rd-party and spec/testimages.com directories for full info.

0.9.0

8 months ago

0.8.0

1 year ago

0.7.2

2 years ago

0.7.1

2 years ago

0.5.0

2 years ago

0.6.0

2 years ago

0.4.5

3 years ago

0.3.0

3 years ago

0.2.0

3 years ago

0.1.1

3 years ago

0.4.4

3 years ago

0.4.1

3 years ago

0.4.0

3 years ago

0.4.3

3 years ago

0.4.2

3 years ago

0.1.0

3 years ago

0.0.0-alpha.16

3 years ago

0.0.0-alpha.15

3 years ago

0.0.0-alpha.9

4 years ago

0.0.0-alpha.13

4 years ago

0.0.0-alpha.12

4 years ago

0.0.0-alpha.11

4 years ago

0.0.0-alpha.10

4 years ago

0.0.0-alpha.8

4 years ago

0.0.0-alpha.7

4 years ago

0.0.0-alpha.6

4 years ago

0.0.0-alpha.5

4 years ago

0.0.0-alpha.4

5 years ago

0.0.0-alpha.3

5 years ago

0.0.0-alpha.2

5 years ago

0.0.0-alpha.1

5 years ago