一系列金属着色器,利用 iOS 17 beta 中添加的全新视觉效果

使命

我开始这个项目是为了更多地了解 Metal 以及如何在 SwiftUI 中使用它。看到网上其他人有兴趣了解和了解更多相关内容的反应,我决定将这个项目开源。我希望这个项目能够帮助其他人更多地了解 Metal 以及如何在 SwiftUI 中使用它。

冶金-1.mp4

建筑学

该项目的整体架构相当容易掌握,但在向项目添加新着色器时需要记住一些事项。

首先,该项目分为两个主要部分:列表视图和详细视图。用户将在列表视图中看到所有可用的着色器。用户将在详细视图中看到正在运行的着色器,并能够调整着色器的参数。

其次,着色器本身分为两个主要部分:着色器展示和模型。着色器展示保存每个着色器的数据,而着色器模型保存每个参数的数据。

然后,着色器被传递到一个类中,该类保存每个着色器的数据。然后,该着色器数组被传递到列表视图中,并在其中向用户显示。当用户选择着色器时,该着色器将传递到详细视图中,并在其中向用户显示。

该项目的设置是为了强调着色器本身。着色器是该项目的主要焦点。这样做可以轻松地在项目中添加和删除着色器,而不必担心为每个着色器创建单独的视图。

冶金-2.mp4

楷模

争论

这保存了每个参数的数据。它被传递到将在着色器函数中使用的每个着色器。它还显示在详细视图中,用户可以在其中进行调整。

class Argument: Identifiable, ObservableObject {
    var id = UUID()
    let name: String
    @Published var value: Float
    let range: ClosedRange<Float>
    let editable: Bool
}
name: String

这将保存参数的名称。这将用于在详细视图中显示参数的名称。

value: Float

这将保持参数的值。这将用于在详细视图中显示参数的值。

range: ClosedRange<Float>

这将保持参数的范围。这将用于在详细视图中显示参数的范围。

editable: Bool

这将保存参数是否应该可编辑。如果参数应该是可编辑的,请将其设置为 true。如果参数不可编辑,请将其设置为 false。

展示柜

它保存每个着色器的数据。这将用于在列表视图中显示着色器的名称以及在详细视图中显示着色器的标题。

class Showcase: Identifiable, ObservableObject {
    var id = UUID()
    let name: String
    let time: Bool
    let size: Bool
    let bounding: Bool
    let function: String
    let category: Categories
    @Published var arguments: [Argument]
}
name: String

这将保存着色器的名称。这将用于在列表视图中显示着色器的名称以及在详细视图中显示着色器的标题。

time: Bool

这将决定着色器是否应该有时间参数。如果着色器应该有时间参数,请将其设置为 true。如果着色器不应有时间参数,请将其设置为 false。

size: Bool

这将保存着色器是否应该有一个大小参数。如果着色器应该有一个大小参数,请将其设置为 true。如果着色器不应有大小参数,请将其设置为 false。

bounding: Bool

这将决定着色器是否应该有一个边界参数。如果着色器应该有一个边界参数,请将其设置为 true。如果着色器不应有边界参数,请将其设置为 false。

function: String

这将保存着色器运行时将调用的函数的名称。请注意拼写和大小写,因此建议保持文件名和函数名相似。

category: Categories

这将保存着色器的类别。无论是颜色着色器、扭曲着色器还是图层着色器。这将用于在详细视图中显示着色器类别按钮的类别。

arguments: [Argument]

这将保存将传递到着色器的参数。确保它们的顺序与着色器函数中的参数相同。

贡献

该项目开放并鼓励贡献!请随意通过创建新的来讨论任何错误修复/功能。如果您有兴趣为此项目贡献代码,请分叉存储库并提交拉取请求。请确保在提交拉取请求之前记录您的代码更改并测试项目。也尽量使代码风格与项目的其余部分保持一致。

免责声明

该项目是在 MIT 许可证下开源的,这意味着您可以完全访问源代码并可以对其进行修改以满足您自己的需求。

该项目还处于测试阶段,因此可能存在一些错误或需要改进的地方。如果您发现任何错误或可以改进的地方,请通过创建新问题来报告。

GitHub

查看 Github