shithub: semblance

Download patch

ref: af0338b7ba4d9c6011caaf10f4fd363da4651a42
author: rodri <[email protected]>
date: Fri Aug 30 16:31:32 EDT 2024

initial dump of ideas.

--- /dev/null
+++ b/readme.md
@@ -1,0 +1,112 @@
+# semblance
+
+Semblance wants to be a shading language.
+
+The idea is for it to have a translator that turns semblance shaders
+into C that can be used with [libgraphics][1], and later turn it into a
+VM that runs in [renderfs][2].
+
+It's largely influenced by the [RSL][3] and [GLSL][4] languages.
+
+## Syntax
+
+	- declare and use custom structs
+	- new types
+		vector	→ Point3 (x,y,z,0)
+		point	→ Point3 (x,y,z,w)
+		point2	→ Point2 (x,y,w)
+		pointN	→ PointN (x,y,[w|z,w]) | N ∈ {2,3} ???
+		normal	→ Point3 (x,y,z,0) | {x,y,z} ∈ [0,1]
+		color	→ Color
+		matrix	→ Matrix[23] ???
+		quat	→ Quaternion
+	- new operators
+		Matrix3 m, n;
+		Point3 a, b;
+		double s;
+
+		b = b * a;	/* b = modulatept3(a, b); */
+		b = b * s;	/* b = mulpt3(b, s); */
+		b = b * m;	/* xform3(b, m); */
+		b = b × a;	/* b = crossvec3(b, a); */
+		b = b · a;	/* b = dotvec3(b, a); */
+		m = m * n;	/* mulm3(m, n); */
+
+		Matrix3 m2:
+		m2 = m * n;	/* identity3(m2); mulm3(m2, m); mulm3(m2, n); */
+				/* alt.: memmove(m2, m, 4*4*sizeof(double)); mulm3(m2, n); */
+	- function polymorphism
+		Point3 a, b;
+		double c, d;
+
+		a = lerp(a, b, 0.4);	/* lerp3(2); */
+		c = lerp(c, d, 0.1);	/* flerp(2); */
+
+		Texture *tex;
+		Cubemap *cm;
+		Point3 dir;
+		Point2 uv;
+		Color c;
+
+		c = sample(tex, uv, nearest);	/* sampletexture(2) */
+		c = sample(cm, dir, bilinear);	/* samplecubemap(2) */
+
+		int a, b;
+		double c, d;
+		Point3 p0, p1;
+
+		a = min(a, b);
+		c = min(c, d);
+		p0 = min(p0, p1);	/* component-wise */
+	- stage-dependent shader parameters
+		- vertex
+			|   in shader   | in libgraphics |
+			+--------------------------------+
+			position	→ sp->v->p
+			normal		→ sp->v->n
+			color		→ sp->v->c
+			uv		→ sp->v->uv
+			material	→ sp->v->mtl
+			tangent		→ sp->v->tangent
+			<attr>		→ sp->v->attrs["<attr>"]
+		- fragment
+			|   in shader   | in libgraphics |
+			+--------------------------------+
+			position	→ sp->v.p
+			color		→ sp->v.c
+			<attr>		→ sp->v.attrs["<attr>"]
+	- swizzles
+		Point3 p;
+		Color c;
+
+		c.rgba = p.xyzw;
+		c.rgb = p.xyz;
+		p.zyx = c.rgb;
+	- builtins
+		In the following cases the absent parameters are replaced by:
+
+			Entity*		→ sp->su->entity
+			Camera*		→ sp->su->camera
+			Framebuf*	→ sp->su->fb
+
+		when translated for libgraphics.
+
+		Point3 model2world(Point3)	/* Point3 model2world(Entity*, Point3); */
+		Point3 world2vcs(Point3)	/* Point3 world2vcs(Camera*, Point3); */
+		Point3 vcs2clip(Point3);	/* Point3 vcs2clip(Camera*, Point3); */
+		Point3 world2clip(Point3);	/* Point3 world2clip(Camera*, Point3); */
+		Point3 clip2ndc(Point3);	/* Point3 clip2ndc(Point3); */
+		Point3 ndc2viewport(Point3);	/* Point3 ndc2viewport(Framebuf*, Point3); */
+		Point3 viewport2ndc(Point3);	/* Point3 viewport2ndc(Framebuf*, Point3); */
+		Point3 ndc2vcs(Point3);		/* Point3 ndc2vcs(Camera*, Point3); */
+		Point3 viewport2vcs(Point3);	/* Point3 viewport2vcs(Camera*, Point3); */
+		Point3 vcs2world(Point3);	/* Point3 vcs2world(Camera*, Point3); */
+		Point3 viewport2world(Point3);	/* Point3 viewport2world(Camera*, Point3); */
+		Point3 world2model(Point3);	/* Point3 world2model(Entity*, Point3); */
+
+## References
+
+[1]: https://shithub.us/rodri/libgraphics
+[2]: https://shithub.us/rodri/renderfs
+[3]: https://renderman.pixar.com/resources/RenderMan_20/shadingLanguage.html
+[4]: https://www.khronos.org/files/opengles_shading_language.pdf