乐知付加密服务平台

如果你有资源, 平台可以帮你实现内容变现, 无需搭建知识付费服务平台。

点击访问官方网站 https://lezhifu.cc

扫码关注公众号 乐知付加密服务平台-微信公众号
vision_pro开发入门一-了解基本情况 | chenzuoli's blog

vision_pro开发入门一-了解基本情况

先了解下开发步骤。

一、环境准备

xcode开发工具
vision pro模拟器

二、项目开发

新建项目
选择vision os

项目的主要文件:

  1. HelloVisionProWorldApp.swift
    入口,尽管它是个最重要的文件,但是只定义了入口,所以没必要看了。核心在我看来只有一句话:“WindowGroup{ContentView()}” 与”let renderer = Renderer(layerRenderer)” 定义好了 窗口与 Render
    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
    import 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)
    }
    }
  2. ContentView.swift
    核心文件
    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
    49
    import 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()
    }

    这个文件差不多是整个 VisionPro 应用的核心所在,你只用了简单的一点定义就把一个 3D 世界呈现在你面前了。
    核心代码只有三行,定义了 Model3D, 设置显示的 Text 为“Hello, world!”,另一个 Toggle 控件”Show Inmersive Space” ,就能看到下面这个完整的 3D 世界。

再来分析一下代码:

VStack 定义了 3D 的布局,其实它是一个标准的 Swift 开发 App 的方式,可以说广大 iOS 的开发者基本上可以无缝迁移到 VisionPro 的开发上,这个生态能力真的相当不错。

然后开发语言也是 Swift,没有任何差异。

  1. Renderer.swift
  2. Shaders.metal
  3. 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 的开发会有足够的认知的。


学无止境。

-------------本文结束感谢您的阅读-------------