|
@@ -71,6 +71,31 @@ THREE.NodeLib.add( new THREE.FunctionNode( [
|
|
|
"}"
|
|
|
].join( "\n" ), null, { derivatives: true } ) );
|
|
|
|
|
|
+//
|
|
|
+// Noise
|
|
|
+//
|
|
|
+
|
|
|
+THREE.NodeLib.add( new THREE.FunctionNode( [
|
|
|
+"float snoise(vec2 co) {",
|
|
|
+ "return fract( sin( dot(co.xy, vec2(12.9898,78.233) ) ) * 43758.5453 );",
|
|
|
+"}"
|
|
|
+].join( "\n" ) ) );
|
|
|
+
|
|
|
+//
|
|
|
+// Hue
|
|
|
+//
|
|
|
+
|
|
|
+THREE.NodeLib.add( new THREE.FunctionNode( [
|
|
|
+"vec3 hue_rgb(vec3 rgb, float adjustment) {",
|
|
|
+ "const mat3 RGBtoYIQ = mat3(0.299, 0.587, 0.114, 0.595716, -0.274453, -0.321263, 0.211456, -0.522591, 0.311135);",
|
|
|
+ "const mat3 YIQtoRGB = mat3(1.0, 0.9563, 0.6210, 1.0, -0.2721, -0.6474, 1.0, -1.107, 1.7046);",
|
|
|
+ "vec3 yiq = RGBtoYIQ * rgb;",
|
|
|
+ "float hue = atan(yiq.z, yiq.y) + adjustment;",
|
|
|
+ "float chroma = sqrt(yiq.z * yiq.z + yiq.y * yiq.y);",
|
|
|
+ "return YIQtoRGB * vec3(yiq.x, chroma * cos(hue), chroma * sin(hue));",
|
|
|
+"}"
|
|
|
+].join( "\n" ) ) );
|
|
|
+
|
|
|
//
|
|
|
// Saturation
|
|
|
//
|
|
@@ -88,8 +113,22 @@ THREE.NodeLib.add( new THREE.FunctionNode( [
|
|
|
//
|
|
|
|
|
|
THREE.NodeLib.add( new THREE.FunctionNode( [
|
|
|
-// Algorithm from Chapter 10 of Graphics Shaders.
|
|
|
+// Algorithm from Chapter 10 of Graphics Shaders
|
|
|
"float luminance_rgb(vec3 rgb) {",
|
|
|
"return dot(rgb, LUMA);",
|
|
|
"}"
|
|
|
].join( "\n" ) ) );
|
|
|
+
|
|
|
+//
|
|
|
+// Vibrance
|
|
|
+//
|
|
|
+
|
|
|
+THREE.NodeLib.add( new THREE.FunctionNode( [
|
|
|
+// Shader by Evan Wallace adapted from @lo-th
|
|
|
+"vec3 vibrance_rgb(vec3 rgb, float adjustment) {",
|
|
|
+ "float average = (rgb.r + rgb.g + rgb.b) / 3.0;",
|
|
|
+ "float mx = max(rgb.r, max(rgb.g, rgb.b));",
|
|
|
+ "float amt = (mx - average) * (-3.0 * adjustment);",
|
|
|
+ "return mix(rgb.rgb, vec3(mx), amt);",
|
|
|
+"}"
|
|
|
+].join( "\n" ) ) );
|