spheres
by Exceeder
HTML
<script src='//cdnjs.cloudflare.com/ajax/libs/three.js/87/three.js'></script>
<script id="frag1" type="x-shader/x-fragment">
uniform float iGlobalTime;
uniform float iTime;
uniform vec2 iResolution;
uniform vec4 iMouse;
uniform sampler2D iChannel0;
varying vec2 fragCoord;
varying vec2 vUv;
// Fun with spherical lights, area shadows, occlusion and reflections.
// Sphere and trace functions by inigo quilez, http://www.iquilezles.org
#define BIAS 0.0001
#define PI 3.1415927
#define SEED 7.
float sphIntersect( in vec3 ro, in vec3 rd, in vec4 sph )
{
vec3 oc = ro - sph.xyz;
float b = dot( oc, rd );
float c = dot( oc, oc ) - sph.w*sph.w;
float h = b*b - c;
if( h<0.0 ) return -1.0;
return -b - sqrt( h );
}
float sphOcclusion( in vec3 pos, in vec3 nor, in vec4 sph )
{
vec3 r = sph.xyz - pos;
float l = length(r);
float d = dot(nor,r);
float res = d;
if( d<sph.w ) res = pow(clamp((d+sph.w)/(2.0*sph.w),0.0,1.0),1.5)*sph.w;
return clamp( res*(sph.w*sph.w)/(l*l*l), 0.0, 1.0 );
}
float sphAreaShadow( vec3 P, in vec4 L, vec4 sph )
{
vec3 ld = L.xyz - P;
vec3 oc = sph.xyz - P;
float r = sph.w - BIAS;
float d1 = sqrt(dot(ld, ld));
float d2 = sqrt(dot(oc, oc));
if (d1 - L.w / 2. < d2 - r) return 1.;
float ls1 = L.w / d1;
float ls2 = r / d2;
float in1 = sqrt(1.0 - ls1 * ls1);
float in2 = sqrt(1.0 - ls2 * ls2);
if (in1 * d1 < in2 * d2) return 1.;
vec3 v1 = ld / d1;
vec3 v2 = oc / d2;
float ilm = dot(v1, v2);
if (ilm < in1 * in2 - ls1 * ls2) return 1.0;
float g = length( cross(v1, v2) );
float th = clamp((in2 - in1 * ilm) * (d1 / L.w) / g, -1.0, 1.0);
float ph = clamp((in1 - in2 * ilm) * (d2 / r) / g, -1.0, 1.0);
float sh = acos(th) - th * sqrt(1.0 - th * th)
+ (acos(ph) - ph * sqrt(1.0 - ph * ph))
* ilm * ls2 * ls2 / (ls1 * ls1);
return 1.0 - sh /...
JavaScript
var myInstance = {
scene: new THREE.Scene(),
camera: new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000),
gameObjects: [],
gameObjectsDict: {},
};
(function(myInstance) {
myInstance.camera.position.x = 0;
myInstance.camera.position.y = 10;
myInstance.camera.position.z = 5;
var webgl = new THREE.WebGLRenderer();
webgl.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(webgl.domElement);
function onWindowResize() {
myInstance.camera.aspect = window.innerWidth / window.innerHeight;
myInstance.camera.updateProjectionMatrix();
renderer.setSize(window.innerWidth, window.innerHeight);
}
window.addEventListener('resize', onWindowResize, false);
renderer = webgl
var light = new THREE.HemisphereLight(0xeeeeee, 0x888888, 1);
light.position.set(0, 20, 0);
myInstance.scene.add(light);
counter = 0;
function render() {
myInstance.gameObjects.forEach(function(item) {
item.update(counter);
});
requestAnimationFrame(render);
renderer.render(myInstance.scene, myInstance.camera);
}
render();
})(myInstance);
(function() {
var gameObject = function(name, x, y, z, col, rx, ry) {
this.name = name
this.geometry = new THREE.BoxGeometry(3, 3, 3);
uniforms = {
iGlobalTime: {
type: "f",
value: 1.0
},
iTime: {
type: "f",
value: 1.0
},
iResolution: {
type: "v2",
value: new THREE.Vector2()
},
};
uniforms.iResolution.value.x = 1; // window.innerWidth;
uniforms.iResolution.value.y = 1; // window.innerHeight;
this.material = new THREE.ShaderMaterial({
uniforms: uniforms,
vertexShader:...