[Three.js] Environment Map과 MeshMaterial: 3D 렌더링에서의 사실적 반사

궁금하면 500원·2024년 12월 26일
0

1. 환경 맵의 성능 최적화

문제: 환경 맵을 사용할 때, HDR 이미지를 사용하면서 발생할 수 있는 성능 문제입니다.
특히 큰 해상도의 HDR 이미지를 로드하면 렌더링 시간이 길어지고, 이는 최종 사용자의 경험에 영향을 미칠 수 있습니다.
이러한 문제를 해결하려면 어떻게 해야 할까요?

해결 방법

  • HDR 이미지 압축: 높은 해상도의 HDR 이미지는 용량이 크기 때문에, 이를 압축하는 방식으로 성능을 최적화할 수 있습니다.
    온라인 툴을 사용하여 HDR 이미지를 압축한 후 로드합니다.

  • 텍스처 로딩 최적화: 텍스처 로딩을 비동기적으로 처리하고, 텍스처가 로드될 때까지 기본적인 환경 맵을 표시하여 사용자가 대기하지 않도록 합니다.

const hdr = '../public/optimized_hdr_image_4k.hdr'; // 최적화된 HDR 이미지 경로
let environmentTexture: THREE.DataTexture;

new RGBELoader().load(hdr, (texture) => {
  environmentTexture = texture;
  environmentTexture.mapping = THREE.EquirectangularReflectionMapping;
  scene.environment = environmentTexture;
  scene.background = environmentTexture;
  scene.environmentIntensity = 1; // Three.js r163에서 새로 추가된 속성
});

압축된 HDR 이미지를 로드하여 환경 맵을 설정한 후, environmentIntensity를 통해 반사되는 빛의 세기를 조절할 수 있습니다.

이렇게 하면 성능을 개선하면서도 질감 있는 환경 맵을 사용할 수 있습니다.

2. 환경 맵 조정 및 블러 처리

문제: 환경 맵의 세부 설정을 조정하려면 어떻게 해야 할까요?
예를 들어, 맵에 있는 반사된 이미지가 너무 강렬하거나 흐릿한 경우 조정해야 할 때가 있을 수 있습니다.

해결 방법

  • 환경 맵의 블러 처리: 배경과 반사된 이미지에 블러를 적용해 더 자연스러운 느낌을 줄 수 있습니다.

  • UI를 통한 실시간 설정 변경: 사용자가 실시간으로 environmentIntensity, toneMappingExposure, backgroundBlurriness와 같은 값을 변경할 수 있도록 GUI를 제공하여 쉽게 실험할 수 있도록 합니다.

gui.add(scene, 'backgroundBlurriness', 0, 1, 0.01); // 배경의 블러 처리 정도 설정

3. MeshMaterial과 환경 맵 상호작용

문제: MeshPhysicalMaterial을 사용할 때, 환경 맵의 반사 효과가 어떻게 적용될까요?
이를 설정하려면 envMapIntensity를 어떻게 다뤄야 할까요?

해결 방법

  • envMapIntensity 설정: MeshPhysicalMaterial에서 환경 맵에 의한 반사도를 설정하는 envMapIntensity를 사용하여 물체에 반사된 빛의 강도를 조절합니다.

  • 동적 환경 맵 적용: 환경 맵을 변경할 때, material.envMap을 명시적으로 설정해줘야 합니다. 이렇게 하지 않으면 envMapIntensity 설정이 적용되지 않기 때문에, 수동으로 반사 텍스처를 설정하는 방법을 사용합니다.

materialFolder.add(material, 'envMapIntensity', 0, 1.0, 0.01).onChange(() => {
  // r163 이후, `envMap`은 `scene.environment`에서 자동으로 복사되지 않기 때문에 수동으로 복사해줘야 함
  if (!material.envMap) {
    material.envMap = scene.environment; // 환경 맵을 수동으로 설정
  }
});

envMapIntensity를 사용하여 환경 맵에 의한 반사도의 강도를 실시간으로 조정할 수 있습니다. 이 값은 scene.environment에 할당된 환경 맵에만 영향을 미치므로, material.envMap을 수동으로 설정해주어야 합니다.

4. 환경 맵의 반영과 실시간 조정

문제: 사용자가 실시간으로 환경 맵을 바꾸거나 환경 맵의 밝기를 조절할 수 있어야 하는 상황에서, 어떻게 인터페이스를 구성할 수 있을까요?

해결 방법

  • GUI 인터페이스 제공: GUI를 사용하여 실시간으로 environmentIntensity나 backgroundBlurriness 값을 조정할 수 있게 합니다.
    이로 인해 사용자는 다양한 환경 맵을 실험하고, 실시간으로 그 변화를 확인할 수 있습니다.
gui.add(scene, 'environmentIntensity', 0, 2, 0.01); // 환경 맵의 조도 조절
gui.add(renderer, 'toneMappingExposure', 0, 2, 0.01); // 톤 매핑 노출 조정

GUI를 통해 실시간으로 환경 맵의 조도를 조정하거나 배경을 변경하는 등의 작업을 할 수 있습니다.
사용자는 인터페이스를 통해 환경 설정을 손쉽게 실험할 수 있습니다.

5. 추가적인 최적화: 렌더링 성능 개선

문제: 환경 맵을 사용하는 데 있어 렌더링 성능이 저하되는 경우, 어떻게 성능을 최적화할 수 있을까요?

해결 방법

  • LOD(Level of Detail): 객체의 크기에 따라 환경 맵의 해상도를 동적으로 낮추는 기법을 사용합니다.

  • 기본 설정에 의한 성능 최적화: renderer.toneMapping 및 toneMappingExposure 설정을 최적화하여 성능을 개선할 수 있습니다.

renderer.toneMapping = THREE.ACESFilmicToneMapping; // 고급 톤 매핑 설정

고급 톤 매핑을 사용하여 렌더링 성능을 개선하고, 불필요한 계산을 최소화할 수 있습니다.
이는 고해상도 환경 맵을 사용하면서도 성능을 유지할 수 있도록 돕습니다.

결론

위의 내용은 환경 맵을 활용한 PBR 구현에서 발생할 수 있는 다양한 문제를 해결하는 방법을 다루고 있습니다.

이를 통해 성능 최적화, 실시간 조정, 반사 효과와 같은 주제를 다루며, 실제 개발에서 자주 발생할 수 있는 문제들을 해결하는 방법을 보여주었습니다.

profile
꾸준히, 의미있는 사이드 프로젝트 경험과 문제해결 과정을 기록하기 위한 공간입니다.

0개의 댓글