Simplify authoring GLSL shaders and reduce boilerplate with a few helpful adjustments.
For example, here's a kindred-style shader:
attribute vec3 position;
attribute vec3 normal;
varying vec3 vNormal;
void vert() {
vNormal = normal;
gl_Position = vec4(position, 1);
}
void frag() {
gl_FragColor = vec4(vNormal * 0.5 + 0.5, 1);
}
Both the vertex and fragment shaders are written together โ removing the need to keep a duplicate list of uniforms/varyings/attributes in each file. You can pass this shader into kindred-shader-formatter
to get two separate fragment and vertex shaders to pass into your WebGL library of choice.
var format = require('kindred-shader-formatter')
var glslify = require('glslify')
var formatted = format(glslify('./shader.glsl'))
console.log(formatted.vert)
console.log(formatted.frag)
This leaves you with two shaders like the following:
precision highp float;
attribute vec3 position;
attribute vec3 normal;
varying vec3 vNormal;
void vert() {
vNormal = normal;
gl_Position = vec4(position, 1);
}
void main() { vert(); }
precision highp float;
varying vec3 vNormal;
void frag() {
gl_FragColor = vec4(vNormal * 0.5 + 0.5, 1);
}
void main() { frag(); }
Under the hood, we're making a few changes to your shaders:
- Vertex and fragment shaders are written as a single shader, using
void vert()
andvoid frag()
respectively in place ofvoid main()
. - Attribute declarations are removed from fragment shaders.
precision highp float;
is automatically added to your shaders if not otherwise specified.- Unused functions are automatically removed using glsl-token-function-shaker.
Formats a combined shader source, returning an object with the vertex and fragment shaders as strings in vert
and frag
respectively.
const format = require('kindred-shader-formatter')
const Shader = require('gl-shader')
const src = format(`
// GLSL shader goes here
`)
const shader = Shader(gl, src.vert, src.frag)
Extracts and returns only the vertex shader from source
.
Extracts and returns only the fragment shader from source
.
MIT. See LICENSE.md for details.