RealityKit 材质:基本渐变

问题描述 投票:0回答:1

你好!

我正在尝试在

RealityKit
中制作一种具有基本渐变的材质。我正在制作一个 iPadOS 应用程序。

一些想法:

  • 我无法使用 Reality Composer Pro 来执行此操作,因为 Shader Graph 工具仅适用于visionOS。
  • 我无法使用 Metal 文件创建着色器,因为我正在使用针对 Swift Playgrounds 的 .swiftpm(应用程序游乐场)文件。 Metal 文件似乎不适用于 Swift Playgrounds(毕竟这是一个 Swift 游乐场)。
  • 我宁愿不使用图像纹理来完成这样的简单事情。那会占用存储空间。我希望它就像将
    .basecolor
    UIColor
    一样简单,但是
    UIColor
    不支持渐变。

我有什么选择?我知道我的要求可能不典型,但我真的需要尽量不打破这些要求。

我从

CustomMaterial
研究了
RealityKit
,但再一次,那些采用金属着色器。很棒的工具,但遗憾的是我无法使用它们,因为我使用的 Swift Playground 似乎不支持 Metal 文件,至少看起来是这样。

我对 MetalKit 进行过简单的研究?这可以帮助我吗?

假设我在

RealityKit
中有一个简单的盒子。考虑到我的限制,我如何对其应用简单的渐变?

我真的很感谢您的帮助。

附注这是一个可供参考的 SwiftUI 项目。

编辑:

我可以创建一个没有图像的纹理吗?也许可以通过将视图制作成纹理并应用它来实现?我该怎么做?这样的优点和缺点是什么?

另一个想法是我可以使用

MetalKit
创建渐变并使用
CustomMaterial
应用它吗?

swiftui metal realitykit metalkit reality-composer-pro
1个回答
0
投票

如果您使用 ImageRenderer 对象,您绝对可以为 RealityKit 纹理创建渐变填充(无需金属着色语言的帮助) 从 SwiftUI 视图生成程序图像。

import SwiftUI
import RealityKit

struct GradientView: View {
    var body: some View {
        Rectangle()
            .frame(width: 512, height: 512)
            .foregroundStyle(
                LinearGradient(gradient: Gradient(colors: [.yellow, .red]), 
                                              startPoint: .top, 
                                                endPoint: .bottom)
            )
    }
}
struct ContentView: View {
    var body: some View {
        ZStack {
            RealityKitView()
                .ignoresSafeArea()
        }
    }
}

struct RealityKitView: UIViewRepresentable {
    let arView = ARView(frame: .zero)
    
    @MainActor func textureFromView() -> UnlitMaterial {
        let renderer = ImageRenderer(content: GradientView())
        guard let cgImage = renderer.cgImage else { return .init() }
        
        var material = UnlitMaterial()
        material.color.texture = try! .init(.generate(from: cgImage, 
                                       options: .init(semantic: .color)))
        return material
    }

    func makeUIView(context: Context) -> ARView {
        let box = ModelEntity(mesh: .generateBox(size: 0.5))
        box.orientation = simd_quatf(angle: .pi/4, axis: [1,1,0])
        box.model?.materials = [self.textureFromView()]
        
        let anchor = AnchorEntity()
        anchor.addChild(box)
        arView.scene.anchors.append(anchor)
        return arView
    }
    func updateUIView(_ view: ARView, context: Context) { }
}
© www.soinside.com 2019 - 2024. All rights reserved.