Here is one good sample from https://threejs.org/examples/#webgl_lightprobe
I want to make a shadow for Shpere model to disable DirectionalLight and envMap by setting value as 0.
Even disable DirectionalLight and envMap, Sphere seems to show by light effect(maybe that is LightProbe).
So, I want only using LightProbe can generate a shadow of Sphere.
But I have no idea.
Here are some my code:
<html lang="en">
<head>
<title>three.js webgl - light probe</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
<link type="text/css" rel="stylesheet" href="main.css">
<style type="text/css">.dg ul {
list-style: none;
margin: 0;
padding: 0;
width: 100%;
clear: both
}
.dg.ac {
position: fixed;
top: 0;
left: 0;
right: 0;
height: 0;
z-index: 0
}
.dg:not(.ac) .main {
overflow: hidden
}
.dg.main {
-webkit-transition: opacity .1s linear;
-o-transition: opacity .1s linear;
-moz-transition: opacity .1s linear;
transition: opacity .1s linear
}
.dg.main.taller-than-window {
overflow-y: auto
}
.dg.main.taller-than-window .close-button {
opacity: 1;
margin-top: -1px;
border-top: 1px solid #2c2c2c
}
.dg.main ul.closed .close-button {
opacity: 1 !important
}
.dg.main:hover .close-button, .dg.main .close-button.drag {
opacity: 1
}
.dg.main .close-button {
-webkit-transition: opacity .1s linear;
-o-transition: opacity .1s linear;
-moz-transition: opacity .1s linear;
transition: opacity .1s linear;
border: 0;
line-height: 19px;
height: 20px;
cursor: pointer;
text-align: center;
background-color: #000
}
.dg.main .close-button.close-top {
position: relative
}
.dg.main .close-button.close-bottom {
position: absolute
}
.dg.main .close-button:hover {
background-color: #111
}
.dg.a {
float: right;
margin-right: 15px;
overflow-y: visible
}
.dg.a.has-save > ul.close-top {
margin-top: 0
}
.dg.a.has-save > ul.close-bottom {
margin-top: 27px
}
.dg.a.has-save > ul.closed {
margin-top: 0
}
.dg.a .save-row {
top: 0;
z-index: 1002
}
.dg.a .save-row.close-top {
position: relative
}
.dg.a .save-row.close-bottom {
position: fixed
}
.dg li {
-webkit-transition: height .1s ease-out;
-o-transition: height .1s ease-out;
-moz-transition: height .1s ease-out;
transition: height .1s ease-out;
-webkit-transition: overflow .1s linear;
-o-transition: overflow .1s linear;
-moz-transition: overflow .1s linear;
transition: overflow .1s linear
}
.dg li:not(.folder) {
cursor: auto;
height: 27px;
line-height: 27px;
padding: 0 4px 0 5px
}
.dg li.folder {
padding: 0;
border-left: 4px solid rgba(0, 0, 0, 0)
}
.dg li.title {
cursor: pointer;
margin-left: -4px
}
.dg .closed li:not(.title), .dg .closed ul li, .dg .closed ul li > * {
height: 0;
overflow: hidden;
border: 0
}
.dg .cr {
clear: both;
padding-left: 3px;
height: 27px;
overflow: hidden
}
.dg .property-name {
cursor: default;
float: left;
clear: left;
width: 40%;
overflow: hidden;
text-overflow: ellipsis
}
.dg .c {
float: left;
width: 60%;
position: relative
}
.dg .c input[type=text] {
border: 0;
margin-top: 4px;
padding: 3px;
width: 100%;
float: right
}
.dg .has-slider input[type=text] {
width: 30%;
margin-left: 0
}
.dg .slider {
float: left;
width: 66%;
margin-left: -5px;
margin-right: 0;
height: 19px;
margin-top: 4px
}
.dg .slider-fg {
height: 100%
}
.dg .c input[type=checkbox] {
margin-top: 7px
}
.dg .c select {
margin-top: 5px
}
.dg .cr.function, .dg .cr.function .property-name, .dg .cr.function *, .dg .cr.boolean, .dg .cr.boolean * {
cursor: pointer
}
.dg .cr.color {
overflow: visible
}
.dg .selector {
display: none;
position: absolute;
margin-left: -9px;
margin-top: 23px;
z-index: 10
}
.dg .c:hover .selector, .dg .selector.drag {
display: block
}
.dg li.save-row {
padding: 0
}
.dg li.save-row .button {
display: inline-block;
padding: 0px 6px
}
.dg.dialogue {
background-color: #222;
width: 460px;
padding: 15px;
font-size: 13px;
line-height: 15px
}
#dg-new-constructor {
padding: 10px;
color: #222;
font-family: Monaco, monospace;
font-size: 10px;
border: 0;
resize: none;
box-shadow: inset 1px 1px 1px #888;
word-wrap: break-word;
margin: 12px 0;
display: block;
width: 440px;
overflow-y: scroll;
height: 100px;
position: relative
}
#dg-local-explain {
display: none;
font-size: 11px;
line-height: 17px;
border-radius: 3px;
background-color: #333;
padding: 8px;
margin-top: 10px
}
#dg-local-explain code {
font-size: 10px
}
#dat-gui-save-locally {
display: none
}
.dg {
color: #eee;
font: 11px 'Lucida Grande', sans-serif;
text-shadow: 0 -1px 0 #111
}
.dg.main::-webkit-scrollbar {
width: 5px;
background: #1a1a1a
}
.dg.main::-webkit-scrollbar-corner {
height: 0;
display: none
}
.dg.main::-webkit-scrollbar-thumb {
border-radius: 5px;
background: #676767
}
.dg li:not(.folder) {
background: #1a1a1a;
border-bottom: 1px solid #2c2c2c
}
.dg li.save-row {
line-height: 25px;
background: #dad5cb;
border: 0
}
.dg li.save-row select {
margin-left: 5px;
width: 108px
}
.dg li.save-row .button {
margin-left: 5px;
margin-top: 1px;
border-radius: 2px;
font-size: 9px;
line-height: 7px;
padding: 4px 4px 5px 4px;
background: #c5bdad;
color: #fff;
text-shadow: 0 1px 0 #b0a58f;
box-shadow: 0 -1px 0 #b0a58f;
cursor: pointer
}
.dg li.save-row .button.gears {
background: #c5bdad url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAANCAYAAAB/9ZQ7AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAQJJREFUeNpiYKAU/P//PwGIC/ApCABiBSAW+I8AClAcgKxQ4T9hoMAEUrxx2QSGN6+egDX+/vWT4e7N82AMYoPAx/evwWoYoSYbACX2s7KxCxzcsezDh3evFoDEBYTEEqycggWAzA9AuUSQQgeYPa9fPv6/YWm/Acx5IPb7ty/fw+QZblw67vDs8R0YHyQhgObx+yAJkBqmG5dPPDh1aPOGR/eugW0G4vlIoTIfyFcA+QekhhHJhPdQxbiAIguMBTQZrPD7108M6roWYDFQiIAAv6Aow/1bFwXgis+f2LUAynwoIaNcz8XNx3Dl7MEJUDGQpx9gtQ8YCueB+D26OECAAQDadt7e46D42QAAAABJRU5ErkJggg==) 2px 1px no-repeat;
height: 7px;
width: 8px
}
.dg li.save-row .button:hover {
background-color: #bab19e;
box-shadow: 0 -1px 0 #b0a58f
}
.dg li.folder {
border-bottom: 0
}
.dg li.title {
padding-left: 16px;
background: #000 url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlI+hKgFxoCgAOw==) 6px 10px no-repeat;
cursor: pointer;
border-bottom: 1px solid rgba(255, 255, 255, 0.2)
}
.dg .closed li.title {
background-image: url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlGIWqMCbWAEAOw==)
}
.dg .cr.boolean {
border-left: 3px solid #806787
}
.dg .cr.color {
border-left: 3px solid
}
.dg .cr.function {
border-left: 3px solid #e61d5f
}
.dg .cr.number {
border-left: 3px solid #2FA1D6
}
.dg .cr.number input[type=text] {
color: #2FA1D6
}
.dg .cr.string {
border-left: 3px solid #1ed36f
}
.dg .cr.string input[type=text] {
color: #1ed36f
}
.dg .cr.function:hover, .dg .cr.boolean:hover {
background: #111
}
.dg .c input[type=text] {
background: #303030;
outline: none
}
.dg .c input[type=text]:hover {
background: #3c3c3c
}
.dg .c input[type=text]:focus {
background: #494949;
color: #fff
}
.dg .c .slider {
background: #303030;
cursor: ew-resize
}
.dg .c .slider-fg {
background: #2FA1D6;
max-width: 100%
}
.dg .c .slider:hover {
background: #3c3c3c
}
.dg .c .slider:hover .slider-fg {
background: #44abda
}
</style>
<style type="text/css">.dg ul {
list-style: none;
margin: 0;
padding: 0;
width: 100%;
clear: both
}
.dg.ac {
position: fixed;
top: 0;
left: 0;
right: 0;
height: 0;
z-index: 0
}
.dg:not(.ac) .main {
overflow: hidden
}
.dg.main {
-webkit-transition: opacity .1s linear;
-o-transition: opacity .1s linear;
-moz-transition: opacity .1s linear;
transition: opacity .1s linear
}
.dg.main.taller-than-window {
overflow-y: auto
}
.dg.main.taller-than-window .close-button {
opacity: 1;
margin-top: -1px;
border-top: 1px solid #2c2c2c
}
.dg.main ul.closed .close-button {
opacity: 1 !important
}
.dg.main:hover .close-button, .dg.main .close-button.drag {
opacity: 1
}
.dg.main .close-button {
-webkit-transition: opacity .1s linear;
-o-transition: opacity .1s linear;
-moz-transition: opacity .1s linear;
transition: opacity .1s linear;
border: 0;
line-height: 19px;
height: 20px;
cursor: pointer;
text-align: center;
background-color: #000
}
.dg.main .close-button.close-top {
position: relative
}
.dg.main .close-button.close-bottom {
position: absolute
}
.dg.main .close-button:hover {
background-color: #111
}
.dg.a {
float: right;
margin-right: 15px;
overflow-y: visible
}
.dg.a.has-save > ul.close-top {
margin-top: 0
}
.dg.a.has-save > ul.close-bottom {
margin-top: 27px
}
.dg.a.has-save > ul.closed {
margin-top: 0
}
.dg.a .save-row {
top: 0;
z-index: 1002
}
.dg.a .save-row.close-top {
position: relative
}
.dg.a .save-row.close-bottom {
position: fixed
}
.dg li {
-webkit-transition: height .1s ease-out;
-o-transition: height .1s ease-out;
-moz-transition: height .1s ease-out;
transition: height .1s ease-out;
-webkit-transition: overflow .1s linear;
-o-transition: overflow .1s linear;
-moz-transition: overflow .1s linear;
transition: overflow .1s linear
}
.dg li:not(.folder) {
cursor: auto;
height: 27px;
line-height: 27px;
padding: 0 4px 0 5px
}
.dg li.folder {
padding: 0;
border-left: 4px solid rgba(0, 0, 0, 0)
}
.dg li.title {
cursor: pointer;
margin-left: -4px
}
.dg .closed li:not(.title), .dg .closed ul li, .dg .closed ul li > * {
height: 0;
overflow: hidden;
border: 0
}
.dg .cr {
clear: both;
padding-left: 3px;
height: 27px;
overflow: hidden
}
.dg .property-name {
cursor: default;
float: left;
clear: left;
width: 40%;
overflow: hidden;
text-overflow: ellipsis
}
.dg .c {
float: left;
width: 60%;
position: relative
}
.dg .c input[type=text] {
border: 0;
margin-top: 4px;
padding: 3px;
width: 100%;
float: right
}
.dg .has-slider input[type=text] {
width: 30%;
margin-left: 0
}
.dg .slider {
float: left;
width: 66%;
margin-left: -5px;
margin-right: 0;
height: 19px;
margin-top: 4px
}
.dg .slider-fg {
height: 100%
}
.dg .c input[type=checkbox] {
margin-top: 7px
}
.dg .c select {
margin-top: 5px
}
.dg .cr.function, .dg .cr.function .property-name, .dg .cr.function *, .dg .cr.boolean, .dg .cr.boolean * {
cursor: pointer
}
.dg .cr.color {
overflow: visible
}
.dg .selector {
display: none;
position: absolute;
margin-left: -9px;
margin-top: 23px;
z-index: 10
}
.dg .c:hover .selector, .dg .selector.drag {
display: block
}
.dg li.save-row {
padding: 0
}
.dg li.save-row .button {
display: inline-block;
padding: 0px 6px
}
.dg.dialogue {
background-color: #222;
width: 460px;
padding: 15px;
font-size: 13px;
line-height: 15px
}
#dg-new-constructor {
padding: 10px;
color: #222;
font-family: Monaco, monospace;
font-size: 10px;
border: 0;
resize: none;
box-shadow: inset 1px 1px 1px #888;
word-wrap: break-word;
margin: 12px 0;
display: block;
width: 440px;
overflow-y: scroll;
height: 100px;
position: relative
}
#dg-local-explain {
display: none;
font-size: 11px;
line-height: 17px;
border-radius: 3px;
background-color: #333;
padding: 8px;
margin-top: 10px
}
#dg-local-explain code {
font-size: 10px
}
#dat-gui-save-locally {
display: none
}
.dg {
color: #eee;
font: 11px 'Lucida Grande', sans-serif;
text-shadow: 0 -1px 0 #111
}
.dg.main::-webkit-scrollbar {
width: 5px;
background: #1a1a1a
}
.dg.main::-webkit-scrollbar-corner {
height: 0;
display: none
}
.dg.main::-webkit-scrollbar-thumb {
border-radius: 5px;
background: #676767
}
.dg li:not(.folder) {
background: #1a1a1a;
border-bottom: 1px solid #2c2c2c
}
.dg li.save-row {
line-height: 25px;
background: #dad5cb;
border: 0
}
.dg li.save-row select {
margin-left: 5px;
width: 108px
}
.dg li.save-row .button {
margin-left: 5px;
margin-top: 1px;
border-radius: 2px;
font-size: 9px;
line-height: 7px;
padding: 4px 4px 5px 4px;
background: #c5bdad;
color: #fff;
text-shadow: 0 1px 0 #b0a58f;
box-shadow: 0 -1px 0 #b0a58f;
cursor: pointer
}
.dg li.save-row .button.gears {
background: #c5bdad url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAANCAYAAAB/9ZQ7AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAQJJREFUeNpiYKAU/P//PwGIC/ApCABiBSAW+I8AClAcgKxQ4T9hoMAEUrxx2QSGN6+egDX+/vWT4e7N82AMYoPAx/evwWoYoSYbACX2s7KxCxzcsezDh3evFoDEBYTEEqycggWAzA9AuUSQQgeYPa9fPv6/YWm/Acx5IPb7ty/fw+QZblw67vDs8R0YHyQhgObx+yAJkBqmG5dPPDh1aPOGR/eugW0G4vlIoTIfyFcA+QekhhHJhPdQxbiAIguMBTQZrPD7108M6roWYDFQiIAAv6Aow/1bFwXgis+f2LUAynwoIaNcz8XNx3Dl7MEJUDGQpx9gtQ8YCueB+D26OECAAQDadt7e46D42QAAAABJRU5ErkJggg==) 2px 1px no-repeat;
height: 7px;
width: 8px
}
.dg li.save-row .button:hover {
background-color: #bab19e;
box-shadow: 0 -1px 0 #b0a58f
}
.dg li.folder {
border-bottom: 0
}
.dg li.title {
padding-left: 16px;
background: #000 url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlI+hKgFxoCgAOw==) 6px 10px no-repeat;
cursor: pointer;
border-bottom: 1px solid rgba(255, 255, 255, 0.2)
}
.dg .closed li.title {
background-image: url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlGIWqMCbWAEAOw==)
}
.dg .cr.boolean {
border-left: 3px solid #806787
}
.dg .cr.color {
border-left: 3px solid
}
.dg .cr.function {
border-left: 3px solid #e61d5f
}
.dg .cr.number {
border-left: 3px solid #2FA1D6
}
.dg .cr.number input[type=text] {
color: #2FA1D6
}
.dg .cr.string {
border-left: 3px solid #1ed36f
}
.dg .cr.string input[type=text] {
color: #1ed36f
}
.dg .cr.function:hover, .dg .cr.boolean:hover {
background: #111
}
.dg .c input[type=text] {
background: #303030;
outline: none
}
.dg .c input[type=text]:hover {
background: #3c3c3c
}
.dg .c input[type=text]:focus {
background: #494949;
color: #fff
}
.dg .c .slider {
background: #303030;
cursor: ew-resize
}
.dg .c .slider-fg {
background: #2FA1D6;
max-width: 100%
}
.dg .c .slider:hover {
background: #3c3c3c
}
.dg .c .slider:hover .slider-fg {
background: #44abda
}
</style>
</head>
<body>
<div id="info">
<a href="http://threejs.org" target="_blank" rel="noopener">three.js</a> webgl - light probe
</div>
<script type="module">
import * as THREE from './threejs/three.module.js';
import {GUI} from './threejs/jsm/libs/dat.gui.module.js';
import {OrbitControls} from './threejs/jsm/controls/OrbitControls.js';
import {LightProbeGenerator} from './threejs/jsm/lights/LightProbeGenerator.js';
var mesh, renderer, scene, camera;
var gui;
var lightProbe;
var directionalLight;
// linear color space
var API = {
lightProbeIntensity: 1.0,
directionalLightIntensity: 0,
envMapIntensity: 0
};
init();
function init() {
// renderer
renderer = new THREE.WebGLRenderer({antialias: true});
renderer.setPixelRatio(window.devicePixelRatio);
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);
// tone mapping
//renderer.toneMapping = LinearToneMapping;
//renderer.toneMappingExposure = API.exposure;
// gamma
renderer.gammaOutput = true;
renderer.gammaFactor = 2.2; // approximate sRGB
renderer.shadowMap.enabled = true;
renderer.shadowMap.type = THREE.PCFSoftShadowMap;
// scene
scene = new THREE.Scene();
// camera
camera = new THREE.PerspectiveCamera(40, window.innerWidth / window.innerHeight, 1, 1000);
camera.position.set(0, 0, 30);
// controls
var controls = new OrbitControls(camera, renderer.domElement);
controls.addEventListener('change', render);
controls.minDistance = 10;
controls.maxDistance = 50;
controls.enablePan = false;
// probe
lightProbe = new THREE.LightProbe();
lightProbe.castShadow = true;
scene.add(lightProbe);
/*// light
directionalLight = new THREE.DirectionalLight(0xffffff, API.directionalLightIntensity);
directionalLight.position.set(100, 100, 100);
directionalLight.castShadow = true;
scene.add(directionalLight);*/
// envmap
var genCubeUrls = function (prefix, postfix) {
return [
prefix + 'px' + postfix, prefix + 'nx' + postfix,
prefix + 'py' + postfix, prefix + 'ny' + postfix,
prefix + 'pz' + postfix, prefix + 'nz' + postfix
];
};
var urls = genCubeUrls('pisa/', '.png');
new THREE.CubeTextureLoader().load(urls, function (cubeTexture) {
cubeTexture.encoding = THREE.sRGBEncoding;
scene.background = cubeTexture;
lightProbe.copy(LightProbeGenerator.fromCubeTexture(cubeTexture));
var geometry = new THREE.BoxBufferGeometry(10, 10, 10);
//var geometry = new TorusKnotBufferGeometry( 4, 1.5, 256, 32, 2, 3 );
var material = new THREE.MeshStandardMaterial({
color: 0xffffff,
metalness: 0,
roughness: 0,
envMap: cubeTexture,
envMapIntensity: API.envMapIntensity,
});
// mesh
mesh = new THREE.Mesh(geometry, material);
mesh.receiveShadow = true;
mesh.castShadow = true;
scene.add(mesh);
var g = new THREE.PlaneBufferGeometry(100, 100);
var m = new THREE.ShadowMaterial({
color: 0x000000,
side: THREE.DoubleSide,
transparent: true,
opacity: .66
});
var o = new THREE.Mesh(g, m);
o.receiveShadow = true;
o.rotation.x = -Math.PI/2;
o.position.y = -5;
scene.add(o);
render();
});
// gui
gui = new GUI();
gui.width = 300;
gui.domElement.style.userSelect = 'none';
var fl = gui.addFolder('Intensity');
fl.add(API, 'lightProbeIntensity', 0, 1, 0.02)
.name('light probe')
.onChange(function () {
lightProbe.intensity = API.lightProbeIntensity;
render();
});
/*fl.add(API, 'directionalLightIntensity', 0, 1, 0.02)
.name('directional light')
.onChange(function () {
directionalLight.intensity = API.directionalLightIntensity;
render();
});*/
fl.add(API, 'envMapIntensity', 0, 1, 0.02)
.name('envMap')
.onChange(function () {
mesh.material.envMapIntensity = API.envMapIntensity;
render();
});
fl.open();
// listener
window.addEventListener('resize', onWindowResize, false);
}
function onWindowResize() {
renderer.setSize(window.innerWidth, window.innerHeight);
camera.aspect = window.innerWidth / window.innerHeight;
camera.updateProjectionMatrix();
render();
}
function render() {
renderer.render(scene, camera);
}
</script>
</body>
</html>