先了解下开发步骤。
一、环境准备
xcode开发工具
vision pro模拟器
二、项目开发
新建项目
选择vision os
项目的主要文件:
- HelloVisionProWorldApp.swift
入口,尽管它是个最重要的文件,但是只定义了入口,所以没必要看了。核心在我看来只有一句话:“WindowGroup{ContentView()}” 与”let renderer = Renderer(layerRenderer)” 定义好了 窗口与 Render1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33import SwiftUI
import CompositorServices
struct ContentStageConfiguration: CompositorLayerConfiguration {
func makeConfiguration(capabilities: LayerRenderer.Capabilities, configuration: inout LayerRenderer.Configuration) {
configuration.depthFormat = .depth32Float
configuration.colorFormat = .bgra8Unorm_srgb
let foveationEnabled = capabilities.supportsFoveation
configuration.isFoveationEnabled = foveationEnabled
let options: LayerRenderer.Capabilities.SupportedLayoutsOptions = foveationEnabled ? [.foveationEnabled] : []
let supportedLayouts = capabilities.supportedLayouts(options: options)
configuration.layout = supportedLayouts.contains(.layered) ? .layered : .dedicated
}
}
@main
struct TestingApp: App {
var body: some Scene {
WindowGroup {
ContentView()
}
ImmersiveSpace(id: "ImmersiveSpace") {
CompositorLayer(configuration: ContentStageConfiguration()) { layerRenderer in
let renderer = Renderer(layerRenderer)
renderer.startRenderLoop()
}
}.immersionStyle(selection: .constant(.full), in: .full)
}
} - ContentView.swift
核心文件这个文件差不多是整个 VisionPro 应用的核心所在,你只用了简单的一点定义就把一个 3D 世界呈现在你面前了。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49import SwiftUI
import RealityKit
import RealityKitContent
struct ContentView: View {
@State private var showImmersiveSpace = false
@State private var immersiveSpaceIsShown = false
@Environment(\.openImmersiveSpace) var openImmersiveSpace
@Environment(\.dismissImmersiveSpace) var dismissImmersiveSpace
var body: some View {
VStack {
Model3D(named: "Scene", bundle: realityKitContentBundle)
.padding(.bottom, 50)
Text("Hello, world!")
Toggle("Show Immersive Space", isOn: $showImmersiveSpace)
.toggleStyle(.button)
.padding(.top, 50)
}
.padding()
.onChange(of: showImmersiveSpace) { _, newValue in
Task {
if newValue {
switch await openImmersiveSpace(id: "ImmersiveSpace") {
case .opened:
immersiveSpaceIsShown = true
case .error, .userCancelled:
fallthrough
@unknown default:
immersiveSpaceIsShown = false
showImmersiveSpace = false
}
} else if immersiveSpaceIsShown {
await dismissImmersiveSpace()
immersiveSpaceIsShown = false
}
}
}
}
}
#Preview(windowStyle: .automatic) {
ContentView()
}
核心代码只有三行,定义了 Model3D, 设置显示的 Text 为“Hello, world!”,另一个 Toggle 控件”Show Inmersive Space” ,就能看到下面这个完整的 3D 世界。
再来分析一下代码:
VStack 定义了 3D 的布局,其实它是一个标准的 Swift 开发 App 的方式,可以说广大 iOS 的开发者基本上可以无缝迁移到 VisionPro 的开发上,这个生态能力真的相当不错。
然后开发语言也是 Swift,没有任何差异。
- Renderer.swift
- Shaders.metal
- ShaderTypes.h
Renders 导入了 Metal, 而 Shaders 与 SHaderTypes 共同定义 Shader 的内容。这里的东西是你实际开发的内容。
- Renderer:负责设置和管理渲染流程。
成员变量
定义了一系列变量,如Metal设备、命令队列、uniform缓冲区、渲染管线状态、深度状态、纹理等。
初始化
init 方法初始化Renderer类,设置Metal相关配置,加载网格(mesh)和纹理等。
方法
startRenderLoop:开始渲染循环,用于不断渲染新的帧。
buildMetalVertexDescriptor:设置Metal的顶点描述符,用于定义顶点数据的组织方式。
buildRenderPipelineWithDevice:创建渲染管线,这是渲染过程的一个重要部分,定义了如何处理顶点和片段。
buildMesh:创建并配置网格,用于渲染。
loadTexture:加载纹理,用于渲染中的表面细节。
updateDynamicBufferState, updateGameState:更新渲染状态,例如处理uniform缓冲区的数据和计算模型的变换。
renderFrame:渲染单个帧的逻辑,包括准备命令缓冲区、配置渲染编码器、绘制网格等。
renderLoop:持续渲染的循环,负责调用renderFrame来渲染每一帧。
所以,未来你大概率要读懂这里的每一行代码,可能对于应用开发者,这是一件难的事。
三、模拟运行
可以看到,在模拟器中运行的结果跟在开发中运行的结果是一样的。
这是个开始,以后我会慢慢增加更多的 VisionPro 开发介绍的,简单的感受。
iOS 熟悉 swift 开发的人可以无缝迁移到VisionPro开发上来,接下来你可能需要懂的就是一些 3D 相关的知识,相信 3D 这事慢慢会成为一个热点的。毕竟 Apple 的生态能力的强大是大家所共知的。
加油,真的期望看到 IT 世界的新变化。
建议有机会学学 swift, blender, 这样你对于 VisionPro 的开发会有足够的认知的。
学无止境。
