shadowmap
spotlight & direction light simple (including self-shadow)
by yi hom
HTML
<div id="info">Lights AND Shadow
</div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r70/three.min.js"></script>
<script src="https://dl.dropboxusercontent.com/u/3587259/Code/Threejs/OrbitControls.js">
</script>
CSS
#info {
position: absolute;
top: 0px;
width: 100%;
padding: 10px;
text-align: center;
color: #ffff00
}
body {
// margin: 0;
overflow: hidden;
}
JavaScript
var camera, scene, renderer, lamp, light, controls;
var mesh2, angle = 0;
init();
animate();
function init() {
scene = new THREE.Scene();
camera = new THREE.PerspectiveCamera(50, window.innerWidth / window.innerHeight, 1, 1000);
camera.position.z = 500;
scene.add(camera);
renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);
renderer.setClearColor(0x333333);
controls = new THREE.OrbitControls(camera, renderer.domElement);
document.body.appendChild(renderer.domElement);
///////////////////////////////////////////////////////////
mesh2 = new THREE.Mesh(new THREE.TorusKnotGeometry(20, 6, 100, 16),
new THREE.MeshLambertMaterial());
scene.add(mesh2);
// floor
var shaderMaterial = new THREE.ShaderMaterial ({
uniforms: THREE.UniformsUtils.merge([
THREE.UniformsLib['shadowmap'],
]),
vertexShader: [
THREE.ShaderChunk[ "shadowmap_pars_vertex" ],
"void main() {",
" vec4 worldPosition = modelMatrix * vec4(position, 1.0);",
" gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);",
THREE.ShaderChunk[ "shadowmap_vertex" ],
"}",
].join('\n'),
fragmentShader: [
THREE.ShaderChunk[ "shadowmap_pars_fragment" ],
"void main() {",
" gl_FragColor = vec4 (0.5,0.5,0.5,1.0);",
THREE.ShaderChunk[ "shadowmap_fragment" ],
"}",
].join('\n'),
});
var floor = new THREE.Mesh(new THREE.PlaneGeometry(400, 400, 130, 130),
shaderMaterial);
floor.rotation.x = -Math.PI / 2;
scene.add(floor);
// soft red ambient
scene.add(new THREE.AmbientLight(0x440000));
///////////////////////////////////////////////////////////
// spotlight
light1 = new THREE.SpotLight(0xffffff, 1);
light1.position.set(0, 150, 0);
light1.angle = Math.PI/3;
light1.exponent = 10;
//light1.penumbra = 1;
light1.target = mesh2;
scene.add(light1);
// shadow map settings
light1.castShadow = true;
/* ... new...