background, reflection, lighting을 설정할 때 사용된다.
원하는 HDRI를 고른다.
https://polyhaven.com/hdris
6개의 Texture로 변경한다.
https://matheowis.github.io/HDRI-to-CubeMap/
CubeTextureLoader를 활용한다.
6개의 texture를 다 load해준다.
scene.background에 적용해준다.
/**
* Loaders
*/
// ...
const cubeTextureLoader = new THREE.CubeTextureLoader()
const environmentMap = cubeTextureLoader.load([
'/environmentMaps/0/px.png',
'/environmentMaps/0/nx.png',
'/environmentMaps/0/py.png',
'/environmentMaps/0/ny.png',
'/environmentMaps/0/pz.png',
'/environmentMaps/0/nz.png'
])
scene.background = environmentMap
scene.environment = environmentMap
scene.background = environmentMap
// Global intensity
const global = {}
global.envMapIntensity = 1
const updateAllMaterials = () =>
{
scene.traverse((child) =>
{
if(child.isMesh && child.material.isMeshStandardMaterial)
{
child.material.envMapIntensity = global.envMapIntensity
}
})
}
gui
.add(global, 'envMapIntensity')
.min(0)
.max(10)
.step(0.001)
.onChange(updateAllMaterials)
/**
* Models
*/
gltfLoader.load(
'/models/FlightHelmet/glTF/FlightHelmet.gltf',
(gltf) =>
{
gltf.scene.scale.set(10, 10, 10)
scene.add(gltf.scene)
updateAllMaterials()
}
)
scene.backgroundBlurriness = 0.2
import { RGBELoader } from 'three/examples/jsm/loaders/RGBELoader.js'
/**
* Loaders
*/
// ...
const rgbeLoader = new RGBELoader()
// HDR (RGBE) equirectangular
rgbeLoader.load('/environmentMaps/0/2k.hdr', (environmentMap) =>
{
environmentMap.mapping = THREE.EquirectangularReflectionMapping
scene.background = environmentMap
scene.environment = environmentMap
})
import { EXRLoader } from 'three/addons/loaders/EXRLoader.js'
/**
* Loaders
*/
// ...
const exrLoader = new EXRLoader()
// HDR (EXR) equirectangular
exrLoader.load('/environmentMaps/nvidiaCanvas-4k.exr', (environmentMap) =>
{
environmentMap.mapping = THREE.EquirectangularReflectionMapping
scene.background = environmentMap
scene.environment = environmentMap
})
https://www.nvidia.com/en-us/studio/canvas/
HDRI의 특징 중에 땅에서 떠있기 때문에 부자연스러운 특징이 있다.
이를 해결하기 위해서 Ground projected environment map를 사용한다.
HDR environment maps에서 environment만 설정하고 사용한다.
GroundProjectedSkybox를 import 한다.
GroundProjectedSkybox(environmentMap)한 skybox를 생성한다.
skybox의 크기를 키운다.
scene에 추가한다.
skybox의 projection radius, height를 변경할 수 있다.
import { GroundProjectedSkybox } from 'three/addons/objects/GroundProjectedSkybox.js'
global.envMapIntensity = 1
// Ground projected skybox
rgbeLoader.load('/environmentMaps/2/2k.hdr', (environmentMap) =>
{
environmentMap.mapping = THREE.EquirectangularReflectionMapping
scene.environment = environmentMap
const skybox = new GroundProjectedSkybox(environmentMap)
skybox.scale.setScalar(50)
gui.add(skybox, 'radius', 1, 200, 0.1).name('skyboxRadius')
gui.add(skybox, 'height', 1, 100, 0.1).name('skyboxHeight')
scene.add(skybox)
})
// Cube render target
const cubeRenderTarget = new THREE.WebGLCubeRenderTarget(
256,
{
type: THREE.FloatType
}
)
scene.environment = cubeRenderTarget.texture
// Cube camera
const cubeCamera = new THREE.CubeCamera(0.1, 100, cubeRenderTarget)
cubeCamera.layers.set(1)
const holyDonut = new THREE.Mesh(
new THREE.TorusGeometry(8, 0.5),
new THREE.MeshBasicMaterial({ color: new THREE.Color(10, 4, 2) })
)
holyDonut.layers.enable(1)
const tick = () =>
{
// ...
// Real time environment map
if(holyDonut)
{
holyDonut.rotation.x = Math.sin(elapsedTime) * 2
cubeCamera.update(renderer, scene)
}
// ...
}
https://24-environment-493xqd11t-hwangsangjins-projects.vercel.app/