Created
December 8, 2020 16:26
-
-
Save robksawyer/4958afc217809896b84d68d777ab9f0b to your computer and use it in GitHub Desktop.
PolyhedronMaterial effect from https://madeinhaus.com/work
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#define SHADER_NAME PolyhedronMaterial | |
precision highp float; | |
uniform sampler2D map; | |
uniform vec2 uvDisp; | |
uniform float time; | |
varying float smoothShading; | |
// varying vec3 viewPos; | |
varying vec2 vUV; | |
// Normalizes a float. Range: [min, max] -> [0, 1] | |
float normFloat(float n, float minVal, float maxVal) { | |
return max(0.0, min(1.0, (n-minVal) / (maxVal-minVal))); | |
} | |
vec4 normVec4(vec4 n, float minVal, float maxVal) { | |
return max(vec4(0.0), min(vec4(1.0), (n-minVal) / (maxVal-minVal))); | |
} | |
void main() { | |
// Map texture | |
gl_FragColor = texture2D(map, vUV); | |
gl_FragColor *= smoothShading; | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#define SHADER_NAME PolyhedronMaterial | |
precision highp float; | |
#define PI 3.14159265 | |
uniform mat4 modelMatrix; | |
uniform mat4 viewMatrix; | |
uniform mat4 projectionMatrix; | |
uniform vec3 cameraPosition; | |
uniform vec2 uvDisp; | |
uniform float opacity; | |
uniform float time; | |
uniform float uvRot; | |
uniform float waveFreq; | |
uniform float waveMultip; | |
uniform float waveMode; | |
attribute vec3 position; | |
attribute vec3 normal; | |
attribute vec3 midpoint; | |
attribute vec2 uv; | |
varying float smoothShading; | |
// varying vec3 viewPos; | |
varying vec2 vUV; | |
// | |
// Description : Array and textureless GLSL 2D/3D/4D simplex | |
// noise functions. | |
// Author : Ian McEwan, Ashima Arts. | |
// Maintainer : stegu | |
// Lastmod : 20110822 (ijm) | |
// License : Copyright (C) 2011 Ashima Arts. All rights reserved. | |
// Distributed under the MIT License. See LICENSE file. | |
// https://github.com/ashima/webgl-noise | |
// https://github.com/stegu/webgl-noise | |
// | |
vec3 mod289(vec3 x) { | |
return x - floor(x * (1.0 / 289.0)) * 289.0; | |
} | |
vec4 mod289(vec4 x) { | |
return x - floor(x * (1.0 / 289.0)) * 289.0; | |
} | |
vec4 permute(vec4 x) { | |
return mod289(((x*34.0)+1.0)*x); | |
} | |
vec4 taylorInvSqrt(vec4 r) { | |
return 1.79284291400159 - 0.85373472095314 * r; | |
} | |
float snoise(vec3 v) { | |
const vec2 C = vec2(1.0/6.0, 1.0/3.0) ; | |
const vec4 D = vec4(0.0, 0.5, 1.0, 2.0); | |
// First corner | |
vec3 i = floor(v + dot(v, C.yyy) ); | |
vec3 x0 = v - i + dot(i, C.xxx) ; | |
// Other corners | |
vec3 g = step(x0.yzx, x0.xyz); | |
vec3 l = 1.0 - g; | |
vec3 i1 = min( g.xyz, l.zxy ); | |
vec3 i2 = max( g.xyz, l.zxy ); | |
// x0 = x0 - 0.0 + 0.0 * C.xxx; | |
// x1 = x0 - i1 + 1.0 * C.xxx; | |
// x2 = x0 - i2 + 2.0 * C.xxx; | |
// x3 = x0 - 1.0 + 3.0 * C.xxx; | |
vec3 x1 = x0 - i1 + C.xxx; | |
vec3 x2 = x0 - i2 + C.yyy; // 2.0*C.x = 1/3 = C.y | |
vec3 x3 = x0 - D.yyy; // -1.0+3.0*C.x = -0.5 = -D.y | |
// Permutations | |
i = mod289(i); | |
vec4 p = permute( permute( permute( | |
i.z + vec4(0.0, i1.z, i2.z, 1.0 )) | |
+ i.y + vec4(0.0, i1.y, i2.y, 1.0 )) | |
+ i.x + vec4(0.0, i1.x, i2.x, 1.0 )); | |
// Gradients: 7x7 points over a square, mapped onto an octahedron. | |
// The ring size 17*17 = 289 is close to a multiple of 49 (49*6 = 294) | |
float n_ = 0.142857142857; // 1.0/7.0 | |
vec3 ns = n_ * D.wyz - D.xzx; | |
vec4 j = p - 49.0 * floor(p * ns.z * ns.z); // mod(p, 7*7) | |
vec4 x_ = floor(j * ns.z); | |
vec4 y_ = floor(j - 7.0 * x_ ); // mod(j, N) | |
vec4 x = x_ *ns.x + ns.yyyy; | |
vec4 y = y_ *ns.x + ns.yyyy; | |
vec4 h = 1.0 - abs(x) - abs(y); | |
vec4 b0 = vec4( x.xy, y.xy ); | |
vec4 b1 = vec4( x.zw, y.zw ); | |
//vec4 s0 = vec4(lessThan(b0, 0.0))*2.0 - 1.0; | |
//vec4 s1 = vec4(lessThan(b1, 0.0))*2.0 - 1.0; | |
vec4 s0 = floor(b0)*2.0 + 1.0; | |
vec4 s1 = floor(b1)*2.0 + 1.0; | |
vec4 sh = -step(h, vec4(0.0)); | |
vec4 a0 = b0.xzyw + s0.xzyw*sh.xxyy ; | |
vec4 a1 = b1.xzyw + s1.xzyw*sh.zzww ; | |
vec3 p0 = vec3(a0.xy, h.x); | |
vec3 p1 = vec3(a0.zw, h.y); | |
vec3 p2 = vec3(a1.xy, h.z); | |
vec3 p3 = vec3(a1.zw, h.w); | |
//Normalise gradients | |
vec4 norm = taylorInvSqrt(vec4(dot(p0, p0), dot(p1, p1), dot(p2, p2), dot(p3, p3))); | |
p0 *= norm.x; | |
p1 *= norm.y; | |
p2 *= norm.z; | |
p3 *= norm.w; | |
// Mix final noise value | |
vec4 m = max(0.6 - vec4(dot(x0, x0), dot(x1, x1), dot(x2, x2), dot(x3, x3)), 0.0); | |
m = m * m; | |
return 42.0 * dot( m*m, vec4( dot(p0, x0), dot(p1, x1), dot(p2, x2), dot(p3, x3) ) ); | |
} | |
vec3 snoiseVec3( vec3 x ) { | |
float s0 = snoise(vec3( x )); | |
float s1 = snoise(vec3( x.y - 19.1, x.z + 33.4, x.x + 47.2 )); | |
float s2 = snoise(vec3( x.z + 74.2, x.x - 124.5, x.y + 99.4 )); | |
return vec3( s0, s1, s2 ); | |
} | |
// Normalizes a float. Range: [min, max] -> [0, 1] | |
float normFloat(float n, float minVal, float maxVal) { | |
return max(0.0, min(1.0, (n-minVal) / (maxVal-minVal))); | |
} | |
void main() { | |
// Apply transforms | |
vec4 realPos = modelMatrix * vec4(position, 1.0); | |
vec4 realMid = modelMatrix * vec4(midpoint, 1.0); | |
// Geom deformation through simplex noise | |
vec3 dispMode = mix(realMid.xyz, realPos.xyz, waveMode); | |
// Places deformation origin at center of poly | |
vec3 translation = modelMatrix[3].xyz; | |
dispMode -= translation; | |
dispMode.z -= 5.0; | |
vec3 displacement = snoiseVec3(dispMode * waveFreq + time); | |
realPos.xyz += displacement * waveMultip; | |
// Calc normals | |
vec3 realNorm = normalize(vec3(modelMatrix * vec4(normal, 0.0))); | |
vec3 lightVector = normalize(cameraPosition - realPos.xyz); | |
smoothShading = dot(realNorm, lightVector) * opacity; | |
// Varyings | |
// viewPos = realPos.xyz; | |
// UV rotation + displacement | |
mat2 rotationMat = mat2(cos(uvRot), -sin(uvRot), sin(uvRot), cos(uvRot)); | |
vec2 uvMidpoint = vec2(0.25, 0.25); | |
// Converts range from [-1, 1] to [-0.25, 0.75] | |
vec2 newUVDisp = (uvDisp + 0.5) / 2.0; | |
vUV = uv - uvMidpoint; | |
vUV *= rotationMat; | |
vUV += uvMidpoint + newUVDisp; | |
gl_Position = projectionMatrix * viewMatrix * realPos; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment