首页 > 其他分享 ># 在 SwiftUI 中使用 Metal Shader

# 在 SwiftUI 中使用 Metal Shader

时间:2024-03-22 21:33:06浏览次数:27  
标签:layer Metal Shader shader SwiftUI position size float2 View

简介

从 iOS 17/macOS 14 开始,SwiftUI 支持使用 Metal shader 来实现一些特效。主要提供三个 View Modifier:colorEffectdistortionEffectlayerEffect 。每个 modifier 的第一个参数是传入的 Shader 实例。

此外,View 实例还新增了一个 visualEffect modifier,用于暴露修饰内容的布局信息。函数签名为 func visualEffect(_ effect: @escaping (EmptyVisualEffect, GeometryProxy) -> some VisualEffect) -> some View ,在这个闭包中给 EmptyVisualEffect 添加上面的三种 shader modifier,通过 GeometryProxy 参数来获取所修饰内容的 size 等信息,可以进一步传递给 shader function。

可惜的是,这些 modifier 只适用于 SwiftUI 的 View,不适用于 UIKit/AppKit 包的 View。

用法

Shader Function

Shader 构造函数为 init(function: ShaderFunction, arguments: [Shader.Argument],而 ShaderFunction 的构造函数为 init(library: ShaderLibrary, name: String)。ShaderLibrary 有一个 static 成员 default,表示 app 的 main bundle 中的 shader library。此外 ShaderLibrary 还提供了 static subscript(dynamicMember _: String) -> ShaderFunction 方法,返回 default shader library 中名字为 name 的 MSL function。

三个 View Modifier 分别操作不同的元素,实现不同的效果,也对 MSL 函数有着各自不同的要求,下面一一介绍。

colorEffect

签名如下:

func colorEffect(
    _ shader: Shader,
    isEnabled: Bool = true
) -> some View

该 modifier 用来操作每个单独的像素,要求提供的 MSL 函数的签名必须和下面的匹配:

[[ stitchable ]] half4 name(float2 position, half4 color, args...)

其中 position 和 color 参数在运行 shader 函数的时候会自动传入,position 表示像素在 user-space 坐标系下的坐标(相对的,Metal 的 clip-space 坐标系区域为 (-1.0, -1.0) 到 (1.0, 1.0)),color 是当前 position 对应像素的颜色。我们也可以通过 args… 可变参数传入自定义的数据。该 shader 函数返回处理后的像素颜色(Fragment shader)。

示例 Shader:

[[ stitchable ]] half4 colorCircle(float2 position, half4 currentColor, float2 size, float radius, half4 circleColor) {
    float2 center = size / 2; // 计算 view 的中心点
    if (length(position - center) < radius) {
        return circleColor * currentColor.a;
    } else {
        return currentColor;
    }
}

在上面的 shader 函数中,除了会默认提供的两个参数 position 和 currentColor 外,我们还额外提供了三个参数 size,radius,circleColor,这三个函数需要在SwiftUI 中进行指定,如下所示:

struct ContentView: View {
    let start = Date()

    var body: some View {
        ZStack {
            TimelineView(.animation) { _ in
                Text("

标签:layer,Metal,Shader,shader,SwiftUI,position,size,float2,View
From: https://www.cnblogs.com/jerrywossion/p/18090457

相关文章

  • 用Compute Shader处理图像数据后在安卓机上不能正常显示渲染纹理
    1)用ComputeShader处理图像数据后在安卓机上不能正常显示渲染纹理2)折叠屏适配问题3)Prefab对DLL中脚本的引用丢失4)如何优化UnityVolumeManager中的ReplaceData这是第378篇UWA技术知识分享的推送,精选了UWA社区的热门话题,涵盖了UWA问答、社区帖子等技术知识点,助力大家更全面地掌握......
  • baremetal bsp工程管理
    参考学习:https://www.bilibili.com/video/BV1yE411h7uQ?p=20&vd_source=432ba293ecfc949a4174ab91ccc526d6 便于bsp工程管理,将工程进行分类管理,如下图Makefile编译脚本文件bsp文件夹存所写的bsp驱动imx6ul文件夹存放imx6ull官方sdk文件imx6ul.lds是链接脚本obj文件夹存在......
  • Unity3D Shader事项法线贴图功能详解
    Unity3D它提供了丰富的功能和工具,使开发人员能够轻松创建出色的游戏和应用程序。其中Shader是Unity3D中非常重要的一部分,它可以帮助开发人员实现各种视觉效果,包括法线贴图功能。对啦!这里有个游戏开发交流小组里面聚集了一帮热爱学习游戏的零基础小白,也有一些正在从事游戏开发的技......
  • Blender Shader Node简单记录
    不知道为什么之前找到的某个教程已经消失了,干脆自己总结算了(生气)以下所有内容均由自己辅助着官网手册进行总结。很是头大啊......基本前提Blender内用以下颜色对应坐标轴:颜色坐标轴红色X轴绿色Y轴蓝色Z轴就和一般uv颜色一样,所有负数区域都是黑色的,毕竟......
  • Unity3D Shader常用数据类型详解
    Unity3D中Shader是用来控制3D物体的外观和表现的一种特殊编程语言。在Shader中,有一些常用的数据类型,了解这些数据类型对于编写高效的Shader非常重要。本文将详细介绍Unity3D中Shader常用的数据类型,并给出相应的技术详解和代码实现。对啦!这里有个游戏开发交流小组里面聚集了一帮热......
  • Unity3D Shader事项法线贴图功能详解
    Unity3D它提供了丰富的功能和工具,使开发人员能够轻松创建出色的游戏和应用程序。其中Shader是Unity3D中非常重要的一部分,它可以帮助开发人员实现各种视觉效果,包括法线贴图功能。对啦!这里有个游戏开发交流小组里面聚集了一帮热爱学习游戏的零基础小白,也有一些正在从事游戏开发的技......
  • MetalLB的应用
    1.概述MetalLB是一个用于Kubernetes的负载均衡器实现,使得你可以在没有外部负载均衡器硬件(例如,在裸机集群上)的情况下使用标准的负载均衡服务。它为你的Kubernetes集群提供了一种创建在本地网络上可访问的LoadBalancer类型的服务的方法。MetalLB主要有两种工作模式:Laye......
  • 如何在FBX剔除Lit.shader依赖
    1)如何在FBX剔除Lit.shader依赖2)Unity出AAB包(PlayAssetDelivery)模式下加载资源过慢问题3)如何在URP中正确打出Shader变体4)XLua打包Lua文件粒度问题这是第371篇UWA技术知识分享的推送,精选了UWA社区的热门话题,涵盖了UWA问答、社区帖子等技术知识点,助力大家更全面地掌握和学习。UWA......
  • Unity shader实现水波的技术原理
    Unityshader是Unity引擎中非常重要的一个部分,它可以用来实现各种各样的特效效果,其中包括水波效果。本文将详细讲解Unityshader实现水波的技术原理,并给出相关的Shader代码实现。对啦!这里有个游戏开发交流小组里面聚集了一帮热爱学习游戏的零基础小白,也有一些正在从事游戏......
  • Shader实现模糊效果
    模糊效果一直是游戏当中用的比较多的,比如一些景深啊,FPS游戏震屏时的模糊,还有些剧情跳转都用到了模糊效果。我们在unity中可以使用Shader来处理模糊效果。一般我们有两种模糊方式,一种是比较简单直接的均值模糊,一种是比较高级当然也有些难度的高斯模糊。简单方式有它的缺陷,难的方式......