WebGLRenderTarget — мощный инструмент в Three.js,
позволяющий рендерить сцену не на экран напрямую, а в текстуру, которая
затем может использоваться в качестве материала на объекте. Это
открывает возможности для реализации зеркал, порталов, экранов
видеонаблюдения и других эффектов динамического отображения сцены внутри
сцены.
WebGLRenderTargetДля создания рендер-таргета используется конструктор
THREE.WebGLRenderTarget. Основные параметры:
const renderTarget = new THREE.WebGLRenderTarget(width, height, {
minFilter: THREE.LinearFilter,
magFilter: THREE.LinearFilter,
format: THREE.RGBAFormat,
depthBuffer: true,
});
THREE.RGBAFormat.После создания таргета его текстуру можно использовать в качестве карты в материале:
const mirrorMaterial = new THREE.MeshBasicMaterial({
map: renderTarget.texture,
});
Для зеркала можно использовать MeshBasicMaterial, чтобы
избежать влияния освещения, так как текстура уже содержит готовый рендер
сцены.
Чтобы реалистично отразить сцену в зеркале, необходимо создать вторую камеру, которая копирует положение и направление основной камеры с учётом отражения:
const mirrorCamera = new THREE.PerspectiveCamera(
mainCamera.fov,
renderTarget.width / renderTarget.height,
mainCamera.near,
mainCamera.far
);
mirrorCamera.position.copy(mainCamera.position);
mirrorCamera.position.reflect(mirrorPlane.normal);
mirrorCamera.lookAt(mirrorPlane.position);
reflect отражает вектор относительно
плоскости.mirrorCamera.lookAt направляет камеру на точку
отражения, чтобы правильно сформировать перспективу.Основной шаг — рендеринг сцены в созданный
WebGLRenderTarget вместо экрана:
renderer.setRenderTarget(renderTarget);
renderer.render(scene, mirrorCamera);
renderer.setRenderTarget(null);
setRenderTarget(null) возвращает рендеринг обратно на
основной экран.Порталы работают по аналогии с зеркалами, но вместо отражения может использоваться другое место сцены. Основные шаги:
WebGLRenderTarget для портала.portalMaterial.map = portalRenderTarget.texture;
Можно добавлять эффекты смещения, вращения или искажения камеры для создания фантастических эффектов перехода между пространствами.
ShaderMaterial
для эффекта размытия, водяной поверхности или искажения
перспективы.// Инициализация рендер-таргета
const renderTarget = new THREE.WebGLRenderTarget(1024, 1024);
// Создание зеркала
const mirrorGeometry = new THREE.PlaneGeometry(5, 5);
const mirrorMaterial = new THREE.MeshBasicMaterial({ map: renderTarget.texture });
const mirrorMesh = new THREE.Mesh(mirrorGeometry, mirrorMaterial);
scene.add(mirrorMesh);
// Камера для зеркала
const mirrorCamera = new THREE.PerspectiveCamera(mainCamera.fov, 1, mainCamera.near, mainCamera.far);
// Анимация
function animate() {
requestAnimationFrame(animate);
// Обновление зеркала
mirrorCamera.position.copy(mainCamera.position);
mirrorCamera.position.reflect(mirrorPlane.normal);
mirrorCamera.lookAt(mirrorPlane.position);
renderer.setRenderTarget(renderTarget);
renderer.render(scene, mirrorCamera);
renderer.setRenderTarget(null);
// Рендер основной сцены
renderer.render(scene, mainCamera);
}
animate();
Этот подход обеспечивает динамическое, интерактивное отображение зеркал и порталов в трехмерной сцене с использованием Three.js, сохраняя гибкость и контроль над камерой, текстурами и материалами.