Contact shadow next try.
This commit is contained in:
parent
3fd862367e
commit
da324bcaa7
@ -49,7 +49,7 @@
|
|||||||
camera.lookAt (new THREE.Vector3 (0.0, 0.0, 0.0));
|
camera.lookAt (new THREE.Vector3 (0.0, 0.0, 0.0));
|
||||||
scene.add (camera);
|
scene.add (camera);
|
||||||
|
|
||||||
let box = new THREE.BoxGeometry (1.0, 1.0, 1.0);
|
let box = new THREE.BoxGeometry (0.5, 1.6, 0.75);
|
||||||
let boxMaterial = new THREE.MeshPhongMaterial ({
|
let boxMaterial = new THREE.MeshPhongMaterial ({
|
||||||
color : 0xcc0000,
|
color : 0xcc0000,
|
||||||
side : THREE.DoubleSide
|
side : THREE.DoubleSide
|
||||||
@ -57,46 +57,50 @@
|
|||||||
let boxMesh = new THREE.Mesh (box, boxMaterial);
|
let boxMesh = new THREE.Mesh (box, boxMaterial);
|
||||||
scene.add (boxMesh);
|
scene.add (boxMesh);
|
||||||
|
|
||||||
let shadowGroup = new THREE.Group ();
|
let planeSizeX = 3.0;
|
||||||
|
let planeSizeY = 3.0;
|
||||||
|
let planeZ = -1.0;
|
||||||
|
|
||||||
|
let shadowGroup = new THREE.Object3D ();
|
||||||
scene.add (shadowGroup);
|
scene.add (shadowGroup);
|
||||||
|
|
||||||
let renderTarget = new THREE.WebGLRenderTarget (512, 512);
|
let shadowRenderTarget = new THREE.WebGLRenderTarget (512, 512);
|
||||||
renderTarget.texture.generateMipmaps = false;
|
shadowRenderTarget.texture.generateMipmaps = false;
|
||||||
|
|
||||||
let planeWidth = 2.0;
|
let shadowPlaneGeometry = new THREE.PlaneGeometry (planeSizeX, planeSizeY)
|
||||||
let planeHeight = 2.0;
|
shadowPlaneMaterial = new THREE.MeshBasicMaterial ({
|
||||||
let plane = new THREE.PlaneGeometry (planeWidth, planeHeight).translate (0.0, 0.0, -1.0);
|
//color : 0x0000cc,
|
||||||
let planeMaterial = new THREE.MeshBasicMaterial ({
|
map : shadowRenderTarget.texture,
|
||||||
map : renderTarget.texture,
|
|
||||||
opacity : 1.0,
|
opacity : 1.0,
|
||||||
transparent: true,
|
transparent: true,
|
||||||
depthWrite : false
|
depthWrite : false
|
||||||
});
|
});
|
||||||
|
|
||||||
let planeMesh = new THREE.Mesh (plane, planeMaterial);
|
let shadowPlaneMesh = new THREE.Mesh (shadowPlaneGeometry, shadowPlaneMaterial);
|
||||||
planeMesh.renderOrder = 1;
|
shadowPlaneMesh.position.z = planeZ;
|
||||||
planeMesh.scale.y = -1;
|
shadowPlaneMesh.scale.y = -1.0;
|
||||||
shadowGroup.add (planeMesh);
|
|
||||||
|
shadowGroup.add (shadowPlaneMesh);
|
||||||
|
|
||||||
let shadowCamera = new THREE.OrthographicCamera (
|
let shadowCamera = new THREE.OrthographicCamera (
|
||||||
-planeWidth / 2.0,
|
-planeSizeX / 2.0,
|
||||||
planeWidth / 2.0,
|
planeSizeX / 2.0,
|
||||||
planeHeight / 2.0,
|
planeSizeY / 2.0,
|
||||||
-planeHeight / 2.0,
|
-planeSizeY / 2.0,
|
||||||
0.0,
|
0.0,
|
||||||
2.0,
|
2.0,
|
||||||
);
|
);
|
||||||
|
shadowCamera.rotation.x = Math.PI;
|
||||||
|
shadowCamera.position.z = planeZ;
|
||||||
|
|
||||||
shadowCamera.position.set (0.0, 0.0, -1.0);
|
shadowGroup.add (shadowCamera);
|
||||||
shadowCamera.up.set (0.0, -1.0, 0.0);
|
|
||||||
shadowCamera.lookAt (new THREE.Vector3 (0.0, 0.0, 0.0));
|
|
||||||
|
|
||||||
let depthMaterial = new THREE.MeshDepthMaterial ();
|
let shadowMaterial = new THREE.MeshDepthMaterial ();
|
||||||
depthMaterial.userData.darkness = { value: 1.0 };
|
shadowMaterial.depthTest = false;
|
||||||
depthMaterial.depthTest = false;
|
shadowMaterial.depthWrite = false;
|
||||||
depthMaterial.depthWrite = false;
|
shadowMaterial.userData.darkness = { value: 1.0 };
|
||||||
depthMaterial.onBeforeCompile = function (shader) {
|
shadowMaterial.onBeforeCompile = (shader) => {
|
||||||
shader.uniforms.darkness = depthMaterial.userData.darkness;
|
shader.uniforms.darkness = shadowMaterial.userData.darkness;
|
||||||
shader.fragmentShader = /* glsl */`
|
shader.fragmentShader = /* glsl */`
|
||||||
uniform float darkness;
|
uniform float darkness;
|
||||||
${shader.fragmentShader.replace (
|
${shader.fragmentShader.replace (
|
||||||
@ -106,23 +110,56 @@
|
|||||||
`;
|
`;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// let cameraHelper = new THREE.CameraHelper (shadowCamera);
|
||||||
|
// shadowGroup.add (cameraHelper);
|
||||||
|
|
||||||
|
let blurRenderTarget = new THREE.WebGLRenderTarget (512, 512);
|
||||||
|
blurRenderTarget.texture.generateMipmaps = false;
|
||||||
|
|
||||||
|
let blurPlaneMesh = new THREE.Mesh (shadowPlaneGeometry);
|
||||||
|
blurPlaneMesh.visible = false;
|
||||||
|
shadowGroup.add (blurPlaneMesh);
|
||||||
|
|
||||||
|
horizontalBlurMaterial = new THREE.ShaderMaterial (THREE.HorizontalBlurShader);
|
||||||
|
horizontalBlurMaterial.depthTest = false;
|
||||||
|
|
||||||
|
verticalBlurMaterial = new THREE.ShaderMaterial (THREE.VerticalBlurShader);
|
||||||
|
verticalBlurMaterial.depthTest = false;
|
||||||
|
|
||||||
new THREE.OrbitControls (camera, renderer.domElement);
|
new THREE.OrbitControls (camera, renderer.domElement);
|
||||||
|
|
||||||
//scene.background = new THREE.Color (0.0, 1.0, 0.0);
|
scene.background = new THREE.Color (0.8, 0.8, 0.8);
|
||||||
renderer.setAnimationLoop ((time) => {
|
renderer.setAnimationLoop ((time) => {
|
||||||
boxMesh.rotation.x = time / 3000;
|
boxMesh.rotation.x = time / 3000;
|
||||||
boxMesh.rotation.y = time / 3000;
|
boxMesh.rotation.y = time / 3000;
|
||||||
boxMesh.rotation.z = time / 3000;
|
boxMesh.rotation.z = time / 3000;
|
||||||
|
|
||||||
scene.overrideMaterial = depthMaterial;
|
scene.overrideMaterial = shadowMaterial;
|
||||||
renderer.setRenderTarget (renderTarget);
|
renderer.setRenderTarget (shadowRenderTarget);
|
||||||
renderer.render (scene, shadowCamera);
|
renderer.render (scene, shadowCamera);
|
||||||
scene.overrideMaterial = null;
|
scene.overrideMaterial = null;
|
||||||
|
|
||||||
|
blurPlaneMesh.visible = true;
|
||||||
|
|
||||||
|
let amount = 5.0;
|
||||||
|
|
||||||
|
blurPlaneMesh.material = horizontalBlurMaterial;
|
||||||
|
blurPlaneMesh.material.uniforms.tDiffuse.value = shadowRenderTarget.texture;
|
||||||
|
horizontalBlurMaterial.uniforms.h.value = amount * 1 / 256;
|
||||||
|
renderer.setRenderTarget (blurRenderTarget);
|
||||||
|
renderer.render (blurPlaneMesh, shadowCamera);
|
||||||
|
|
||||||
|
blurPlaneMesh.material = verticalBlurMaterial;
|
||||||
|
blurPlaneMesh.material.uniforms.tDiffuse.value = blurRenderTarget.texture;
|
||||||
|
verticalBlurMaterial.uniforms.v.value = amount * 1 / 256;
|
||||||
|
renderer.setRenderTarget (shadowRenderTarget);
|
||||||
|
renderer.render (blurPlaneMesh, shadowCamera);
|
||||||
|
|
||||||
|
blurPlaneMesh.visible = false;
|
||||||
|
|
||||||
renderer.setRenderTarget (null);
|
renderer.setRenderTarget (null);
|
||||||
renderer.render (scene, camera);
|
renderer.render (scene, camera);
|
||||||
});
|
});
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
window.onload = function () {
|
window.onload = function () {
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user