SceneKit – 加载 HDR 或 EXR lightingEnvironment 没有效果

SceneKit – Loading HDR or EXR lightingEnvironment has no effect

我尝试加载一个 .hdr 文件以将其用作天空盒并使用其光照信息。这是我使用的代码:

backgroundColor = UIColor.gray 
// check if a default skybox is added

let environment = UIImage(named: "studio_small_09_2k.hdr")
scene?.lightingEnvironment.contents = environment
scene?.lightingEnvironment.intensity = 1.0
scene?.background.contents = environment

不幸的是,我收到一个灰色屏幕,也没有错误。有没有人有在 SceneKit 中使用 hdr 文件的经验?

XCode版本:13.2.1 iOS版本:15.3.1 hdr 文件:https://polyhaven.com/a/studio_small_09

我通常使用,其中6张图片每张都是正方形(height == width)

此外,还支持以下立方体贴图表示:

  • 垂直条带作为单个图像(height == 6 * width)
  • 水平条作为单个图像(6 * height == width)
  • 作为单个图像的球面投影(2 * height == width)

这是一个 SwiftUI 代码:

func makeUIView(context: Context) -> SCNView {

    let sceneView = SCNView(frame: .zero)
    sceneView.scene = SCNScene()
    // if EXR or HDR is 2:1 spherical map, it really meets the requirements
    sceneView.scene?.lightingEnvironment.contents = UIImage(named: "std.exr")
    sceneView.backgroundColor = .black
    sceneView.autoenablesDefaultLighting = true
    sceneView.allowsCameraControl = true
    
    let node = SCNNode()
    node.geometry = SCNSphere(radius: 0.1)
    node.geometry?.firstMaterial?.lightingModel = .physicallyBased
    node.geometry?.firstMaterial?.metalness.contents = 1.0
    sceneView.scene?.rootNode.addChildNode(node)
    return sceneView
}

请特别注意 - 您需要 .physicallyBased 照明模型才能获得 HDR 或 EXR 反射。

让我们为 BG 设置它:

sceneView.scene?.background.contents = UIImage(named: "std.exr")


为什么你的 .exr 不起作用?

解决方法很简单:从项目中删除你的.exr,清空垃圾桶,然后drag-and-drop.exr文件,在Choose options for adding these fileswindow中选择Add to targets:

现在你的 .exr 必须工作了。