shadowmap
spotlight & direction light simple (including self-shadow)
by Millieyan
HTML
<div id="info">Shadowmap & ShaderMaterial
</div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r70/three.min.js"></script>
<!--script src="https://threejs.org/examples/js/controls/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;
var floor;
init();
animate();
function init() {
scene = new THREE.Scene();
camera = new THREE.PerspectiveCamera(50, window.innerWidth / window.innerHeight, 1, 1000);
//camera.position.z = 500;
camera.position.set (100, 200, 500);
camera.lookAt (new THREE.Vector3());
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'],
{
floorColor: {type:'f', value: 0.3}
}
]),
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" ],
"uniform float floorColor;",
"void main() {",
" gl_FragColor = vec4 (vec3(floorColor),1.0);",
THREE.ShaderChunk[ "shadowmap_fragment" ],
"}",
].join('\n'),
});
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);
...