Swift/Swift 개발 노트

[iOS/SceneKit] Blender hdri 불러와서 적용하기

힛해 2024. 8. 30. 21:52
728x90

 

블렌더에서 디자인한 질감 및 양감을 구현하기위해 SCNLight를 사용해서 방향성조명을 추가해 명암효과를 내려 했지만

 

확실히 블렌더에서 디자인 된 느낌을 따라하기에는 부족함이 있었다.

 

그래서 나온 해결방법이 블렌더 hdri 적용이다.

 

우선 hdri 파일을 불러와보자.

 

1. hdri 파일 프로젝트에 추가하기

나는 이부분이 제일 어려웠다.

 

UIImage로 불러와야하는지 Image로 불러와야하는지 어떠한 래퍼런스도 찾아볼 수 없었다.

 

또 어떤 형태로 받아와야하는지도..

 

그래서 로컬 파일을 불러오는 형식으로 만들어보았다.

 guard let hdrURL = Bundle.main.url(forResource: "lythwood_field_4k", withExtension: "hdr") else {
            print("HDR 이미지 파일을 찾을 수 없습니다.")
            return scene
        }
        
scene.lightingEnvironment.contents = hdrURL

 

그런데 계속 이미지 파일을 찾을 수 없었다.

 

Assets.xcassets 파일에 ImageSet, Data Set 으로추가를 하고 빌드할때 포함되있는것까지 확인했는데 불러오지 못했다.

 

해결방법은 바로 리소스 폴더 하위에 바로 집어 넣는것이다.

 

추가해줄때 target 추가를 해주어야 정상적으로 추가되어 불러올 수 있게 된다.

 

그렇게 추가해주고 불러온 hdri 파일에 설정된 값을 확인해보자.

 

 let materialProperty = SCNMaterialProperty(contents: hdrURL)

    
       print("Intensity: \(materialProperty.intensity)")
       print("Minification Filter: \(materialProperty.minificationFilter)")
       print("Magnification Filter: \(materialProperty.magnificationFilter)")
       print("Mipmap Filter: \(materialProperty.mipFilter)")
       print("Contents Transform: \(materialProperty.contentsTransform)")
       print("Wrap S: \(materialProperty.wrapS)")
       print("Wrap T: \(materialProperty.wrapT)")
       print("Mapping Channel: \(materialProperty.mappingChannel)")

 

출력결과

더보기

Intensity: 1.0

Minification Filter: SCNFilterMode(rawValue: 2)

Magnification Filter: SCNFilterMode(rawValue: 2)

Mipmap Filter: SCNFilterMode(rawValue: 0)

Contents Transform: SCNMatrix4(m11: 1.0, m12: 0.0, m13: 0.0, m14: 0.0, m21: 0.0, m22: 1.0, m23: 0.0, m24: 0.0, m31: 0.0, m32: 0.0, m33: 1.0, m34: 0.0, m41: 0.0, m42: 0.0, m43: 0.0, m44: 1.0)

Wrap S: SCNWrapMode(rawValue: 1)

Wrap T: SCNWrapMode(rawValue: 1)

Mapping Channel: 0

 

그럼 우리의 ScnView에 추가해보자.

 

2. hdri scene 적용하기

scene.lightingEnvironment.contents = hdrURL
scene.lightingEnvironment.intensity = 1.5 // 디자이너분이 말씀해주시는 값으로..!

 

정상적으로 추가되는 것을 볼 수 있다.

 

기존에 추가해두었던 카메라 및 조명들은 다 지워주어야한다.

 

추가적으로 환경조명의 경우 블렌더상에서도 직접 추가해주기때문애 환경조명은 자식노드에 추가해주자..!

 

Before & After 비교

 

노력해서 적용한 보람이 있다..!