你好!
我正在尝试在
RealityKit
中制作一种具有基本渐变的材质。我正在制作一个 iPadOS 应用程序。
一些想法:
.basecolor
与 UIColor
一样简单,但是 UIColor
不支持渐变。我有什么选择?我知道我的要求可能不典型,但我真的需要尽量不打破这些要求。
我从
CustomMaterial
研究了RealityKit
,但再一次,那些采用金属着色器。很棒的工具,但遗憾的是我无法使用它们,因为我使用的 Swift Playground 似乎不支持 Metal 文件,至少看起来是这样。
我对 MetalKit 进行过简单的研究?这可以帮助我吗?
假设我在
RealityKit
中有一个简单的盒子。考虑到我的限制,我如何对其应用简单的渐变?
我真的很感谢您的帮助。
附注这是一个可供参考的 SwiftUI 项目。
编辑:
我可以创建一个没有图像的纹理吗?也许可以通过将视图制作成纹理并应用它来实现?我该怎么做?这样的优点和缺点是什么?
另一个想法是我可以使用
MetalKit
创建渐变并使用 CustomMaterial
应用它吗?
如果您使用 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) { }
}