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 files
window中选择Add to targets
:
现在你的 .exr
必须工作了。
我尝试加载一个 .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
我通常使用(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 files
window中选择Add to targets
:
现在你的 .exr
必须工作了。