将自定义 SKShader 应用于 SKScene,使用 Swift 对 iOS 8 SpriteKit 中的整个渲染场景进行像素化

2023-12-15

我正在尝试在 SKScene 上创建全屏像素化效果。我了解到应该有两种选择来做到这一点:

  • 使用自定义SKShader使用 GLES 2.0。
  • 使用核心图像过滤器。

我尝试添加一个自定义 SKShader,它应该通过像素化来修改整个屏幕。我不确定是否可能,但文档来自SKScene(这是一个子类SKEffectNode)建议:

SKEffectNode 对象将其子对象渲染到缓冲区中,并 可以选择将核心图像过滤器应用于此渲染的输出。

可以将 SKShader 分配给 SKScene,如下所示GameScene : SKScene:

override func didMoveToView(view: SKView) {
    let shader = SKShader(fileNamed: "pixelation.fsh")
    self.shader = shader
    self.shouldEnableEffects = true
}

...但渲染的缓冲区似乎没有作为 u_texture 传递给 GLES:

void main()
{
    vec2 coord = v_tex_coord;
    coord.x = floor(coord.x * 10.0) / 10.0;
    coord.y = floor(coord.y * 10.0) / 10.0;
    vec4 texture = texture2D(u_texture, coord);
    gl_FragColor = texture;
}

...所以之前的着色器不起作用。

如果我将该着色器分配给基于纹理的SKSpriteNode, 有用。

那么,在渲染所有节点之后,是否可以修改整个帧缓冲区(例如将其像素化)作为后处理措施?

Edit:我找到了一种在 OS X 中使用 Core Image 滤镜进行像素化的方法(如何将 CIPixellate Core Image Filter 添加到 Sprite Kit 场景?),但复制该实现不会在 iOS 上产生任何结果。根据文件 CIPixellate应该Available in OS X v10.4 and later and in iOS 6.0 and later..


我设法使用 Core Image 过滤器使其工作CIPixellate。我用 is 作为过滤器SKEffectNode来产生像素化效果。有几点需要注意:

  • SKScene是一个子类SKEffectNode,但将过滤器应用于SKScene不起作用。它会弄乱背景并且不会进行任何像素化。
  • 你需要创建一个SKEffectNode并在其下添加要像素化的节点。

这是基于您选择时生成的代码的解决方案Game键入项目Swift:

import SpriteKit

class GameScene: SKScene {
    var effectNode : SKEffectNode = SKEffectNode.node()

    override func didMoveToView(view: SKView) {
        let filter = CIFilter(name: "CIPixellate")
        filter.setDefaults()
        filter.setValue(5.0, forKey: "inputScale")

        self.effectNode.filter = filter
        self.effectNode.shouldEnableEffects = true
        self.addChild(effectNode)
    }

    override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
        for touch: AnyObject in touches {
            let location = touch.locationInNode(self)

            let sprite = SKSpriteNode(imageNamed:"Spaceship")

            sprite.xScale = 0.5
            sprite.yScale = 0.5
            sprite.position = location

            let action = SKAction.rotateByAngle(CGFloat(M_PI), duration:1)

            sprite.runAction(SKAction.repeatActionForever(action))

            self.effectNode.addChild(sprite)
        }
    }

    override func update(currentTime: CFTimeInterval) {
        /* Called before each frame is rendered */
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将自定义 SKShader 应用于 SKScene,使用 Swift 对 iOS 8 SpriteKit 中的整个渲染场景进行像素化 的相关文章

  • 删除后台 moc 中的对象然后在主 moc 中刷新它会导致 NSFetchedResultsController 更新崩溃

    我遇到了一个NSObjectInaccessibleException我无法理解 Terminating app due to uncaught exception NSObjectInaccessibleException reason
  • 为什么我们在 @synchronized 块中传递 self ?

    我猜 synchronized 块不依赖于对象 而是依赖于线程 对吗 既然如此 我们为什么要传递 self 呢 synchronized是语言提供的用于创建同步作用域的构造 因为使用简单的全局共享互斥锁效率非常低 因此序列化每个单独的互斥锁
  • 应用程序图标未刷新

    我更改了新版本应用程序中的图标图像 并且我在设备中安装了旧版本应用程序 然后我安装了新版本 它在 iOS 5 中运行良好 但在 iOS 6 中 图标没有刷新 它仍然显示旧版本图标 徽标 如果没有安装旧版本应用程序 该设备在 iOS 5 和
  • 自动调整大小完成后如何获取帧大小

    我想知道 如何以及何时 viewDidLoad viewWillAppear viewDidAppear 可以获得自动调整大小以适合其父视图的 UIViews 框架大小 从你的问题中不清楚你为什么想要它 但我想这是为了布局你的子视图 幸运的
  • iOS 4.2.1 丢失文件?

    这是我第一次使用最新的 xcode 3 2 5 和新的 iOS 4 2 1 当我在设备上运行应用程序时 我收到以下运行时错误 无法读取 Developer Platforms iPhoneOS platform DeviceSupport
  • iOS 解决方案仅当图像尚未使用 SDWebImage 缓存在内存中时才加载带有动画的图像

    我已经为这个问题苦苦挣扎了几天 以前我使用 AFNetworking 类别来加载和缓存图像 但它的回调中没有提供缓存类型 所以我过去常常在每个控制器中跟踪哪些图像已经加载 我浏览了 SDWebImage 它提供了我正在寻找的东西 SDIma
  • 使用 UIImagePickerController 的应用程序在拍照后选择“使用照片”时冻结

    我现在正在开发一个简单的照片和视频捕获应用程序 该应用程序成功地允许用户按下按钮即可拍摄照片或视频 但是 一旦您完成拍摄照片或视频 它就会提供 2 个选项 重新拍摄 和 使用照片 或 使用视频 具体取决于您使用的选项 如果用户点击 重新拍摄
  • 尝试从独立的 Apple Watch 应用发出网络请求

    当应用程序是独立应用程序时 Apple Watch 是否无法进行网络通话 即使手表已连接到 iPhone 我正在使用新的独立应用程序目标 它没有附带可以发出 WatchConnectivity 请求的配对 iOS 应用程序 我十有八九收到
  • iOS 外部附件框架:如何获取特定 MFI 设备的协议字符串

    我正在编写一个 iOS 应用程序 用于与 mini mPlay Drumi MP18B 小型蓝牙扬声器 进行通信 据我所知 showBluetoothAccessoryPickerWithNameFilter仅显示协议字符串添加到 Info
  • Swift 对异步编程有什么语言级别的支持(如果有)?

    当应用程序必须通过不可预测的网络 例如智能手机应用程序 进行通信时 异步编程对于响应式用户界面来说是必须的 用户界面必须保持响应 同时等待结果从互联网上某处的服务器返回 在大多数语言中 应用程序程序员必须实现自己的状态机 可能使用闭包 来响
  • Swift:从自定义 UITableViewCell 中的 UITextField 检索文本并将其放入数组中

    我正在制作一个非常简单的应用程序 用户在第一个屏幕中输入人数 在第二个屏幕中 它会生成一些UITableViewCell基于用户在第一个屏幕中输入的数字 这UITableViewCell have a UITextField在其中 一旦用户
  • iOS 内存警告

    我正在尝试使用从 Parse 数据库下载的图像填充集合视图 但我收到内存警告 然后偶尔崩溃 有谁知道其他应用程序如何设法呈现这么多图像而不崩溃 有人可以告诉我如何优化我已有的东西吗 这是所有相关代码 https gist github co
  • 如何从 NSString 中删除十六进制字符

    我面临一个与字符串中的某些十六进制值相关的问题 我需要从字符串中删除十六进制字符 The problem is when i print object it prints as BLANK line And in debug mode it
  • 更改 UITextField 辅助功能描述

    有没有办法将 UITextField 的辅助功能标签设置为 文本字段 之外的其他内容 因此 我不想将其称为 文本字段 而是将其命名为 代码验证字段 我的建议是不要试图在内置语音输出上智取系统 对于盲人用户来说 文本字段正在编辑 相当于 该项
  • 为了支持 iPhone 5 的更长屏幕,需要检查什么? [复制]

    这个问题在这里已经有答案了 可能的重复 iPhone 5屏幕尺寸如何处理 https stackoverflow com questions 12396545 how to deal with iphone 5 screen size iP
  • 在模拟器中运行应用程序时删除本地通知的 iOS 权限警报

    我正在尝试编写验收测试KIF https github com kif framework KIF在一个很早就要求本地通知权限的应用程序上 不幸的是 由于 iOS 模拟器安全原因无法使用 KIF 自动接受 iOS 权限警报 https gi
  • 如何在 Xcode 4 中通过一个操作归档多个目标

    我有一个包含多个目标的项目 这些目标都适用于不同的 iOS 应用程序 例如 一个用于精简版的目标 另一个用于专业版的目标 我想立即构建并归档我的所有应用程序 目前 我对每个目标都有一个方案 我用它来独立归档每个应用程序 但现在我必须开始归档
  • 如何在 EKRecurrenceRule 中设置一周中某一天的数组?

    我想在用户选择的特定日期每周添加事件 可以是一个或多个 也可以是一整天 我将用户选择的日期值存储在模型类变量中 但是 当我添加事件并选择日期时 假设今天是星期一 我选择星期二和星期三并保存 然后我查看周一和周三添加的 iPhone 日历 我
  • 为什么 GDB 调试器不断冻结 Xcode 4?

    这真是一个奇怪的错误 我正在开发一个使用相机源的 iPhone 项目 并通过 OpenGL 着色器运行它以对其应用效果 然而 每次我在代码中简单地创建一个新的 GLfloat 时 调试器都会在启动时冻结 我无法复制和粘贴文本 因为整个 XC
  • 应用未能及时恢复

    我在一个非常具体的场景中遇到 未能及时恢复 崩溃 我认为与看门狗相关 仅在从后台恢复时 并且仅在进入后台后在很短的时间内执行此操作 a最多几秒钟 这似乎是相关的崩溃日志 Incident Identifier E30F2238 5B15 4

随机推荐

  • 如何在 C# 中创建动态大小的数组或重新调整数组的大小?

    我需要知道如何在 C 中动态调整数组大小 在我下面编写的方法中 我需要能够返回一个仅包含用户输入的数字 最多 8 个数字 的数组 因此 如果用户决定只想输入 3 个数字 则数组应该只包含 3 个数字 而不是 8 个 现在我知道数组在实例化时
  • 在 Spring 测试中禁用 @EnableScheduling

    当我运行单元测试时 它会调用我的计划任务 我想防止这种行为 这是因为我有 EnableScheduling在我的主要应用程序配置上 如何在单元测试中禁用此功能 我遇到过这个问题 答案这建议设置配置文件 不知道我会怎么做 或者是否太过分了 我
  • MySQL 查询 - 使用 URL 名称识别数据,其中数据被组织成层次结构

    我有一个名为 content 的 mysql 表 它存储内容管理系统的内容数据 注意 所有内容都使用父 id 列组织成层次结构 id slug content type id parent 1 portfolio 5 0 2 about u
  • Java 同时淡入和淡出两个 JPanel

    我有一个 JPanel 列表 我想将其显示为 幻灯片 其中一个 JPanel 淡出 列表中的下一个 JPanel 淡入 这是我正在摆弄的代码 public float opacity 0f private Timer fadeTimer p
  • 在 Windows 上仅安装 Quicktime 库

    There s Quicktime SDK对于 Windows 但任何使用它的应用程序都需要在系统上安装 Quicktime 运行时库 SDK 本身只有标头和库存根 而不是实际的 DLL 如果我的应用程序使用 Quicktime 我想使用其
  • Jquery MVC 4 客户端验证不起作用

    我正在尝试在一个简单的 MVC 4 应用程序上使用 jQuery 验证插件 我在 MVC 3 中完成的操作没有任何问题 但我根本无法让它工作 我希望在以下情况下触发验证 1 我的控制失去焦点 2 提交表单 任何关于我错过的想法将不胜感激 L
  • Google place api 在 Android 中显示错误

    我在这里面临一个奇怪的问题 我想从我的 Android 应用程序查询 google 地点网络服务 为此 我总是收到错误 此服务需要 API 密钥 然而 当我尝试使用 Chrome 浏览器和服务器密钥查询它时 我得到了正确的响应 对于 and
  • 忽略“无法从 START_ARRAY 令牌中反序列化 java.util.LinkedHashMap 实例”错误

    我正在使用来自外部合作伙伴的 API 不幸的是 返回的响应似乎没有固定的结构 理想情况下 API 合同意味着它不会被违反 但这种情况不断发生 无论如何 JSON 响应中的字段主要是一个映射 但有时 突然它是一个列表 例如 假设以下是我通常得
  • 如何多次更新树的节点?

    我遇到了一个基于树数据结构的有趣问题 We are given a tree which has N nodes with 1 N 105 时间从第 1 秒开始并持续q秒 每一秒 每个内部节点的值都会传输到其所有子节点 除叶节点外 所有节点
  • 批处理 if 语句不起作用

    以下代码不起作用 无论我输入什么 都会返回一个错误 然后返回Retry echo off maths set p Mathsa first number echo your first number is Mathsa retry set
  • 使用 CSS 根据浏览器大小自动调整图像大小

    我希望在调整浏览器窗口大小时自动调整所有 或部分 图像的大小 我发现了以下代码 但它没有做任何事情 HTML div div
  • 如何查找 Id 属性或与导航属性相关的属性?

    对于我正在使用实体框架的项目 我希望能够枚举给定对象实例的所有导航属性 假设它是由 EF 生成的对象 从那里我想获取每个导航属性的相关 Id 属性 例如 如果我得到该类的一个实例Person 我希望能够找到它的导航属性 称为Address
  • Yii 在模型中设置默认排序顺序

    我用 Yii 创建了一个网络应用程序yii 用户扩展 在用户列表页面 显示按created at排序的用户列表 我想按用户名显示用户列表顺序 这是原始代码 public function search criteria new CDbCri
  • 如何组合 Laravel Blade 指令来检查表单输入字段

    使用 Laravel Blade 时 我可以使用 Blade error 指令检查表单输入错误 error name Do something enderror 但是 有没有办法可以检查特定输入字段是否存在多个错误 error name e
  • 将 jquery 验证附加到替换元素

    我有一个带有下拉列表的 aspnet mvc 表单 我将其替换为 jquery 组合框 原始的下拉列表有一个针对它的客户端验证设置 使用不显眼的库和标准 jquery 验证 我希望将此验证附加到组合框 作为组合框生成的一部分 名称将从投放器
  • c 中的双指针和二维数组

    我正在尝试使用双指针访问二维数组 int x 2 2 10 20 30 40 int xp int xpp printf d d n d d n x 0 0 x 0 1 x 1 0 x 1 1 printf n xp x printf d
  • 什么是 git diff ^<感叹号>?

    我通常通过 git diff commit 来检查提交的内容 但是 当我将其应用于初始提交时 我随后看到了来自不同提交的更改的混合 而我认为它应该是提交的初始副本 有人可以帮助我从语义上理解它吗 顺便说一句 我知道有很好的答案如何显示 in
  • Rx 如何将命令与另一个可观察的结合起来

    我有许多反应性命令以及一些保存一些信息的可观察量 我正在尝试执行以下操作 navigate ReactiveCommand Create CanNavigate navigate CombineLatest navigationTarget
  • Highcharts - 为什么第一列之前和最后一列之后有额外的间距?

    我有一个 Highcharts 日期时间柱形图 其中有几个动态添加和更新的系列 看来该库正在生成的图表在第一列之前和最后一列之后有很大的空间 就好像这些列被分组到图表的中心 而它们应该均匀地排列在整个空间中 我尝试调整轴选项的 minPad
  • 将自定义 SKShader 应用于 SKScene,使用 Swift 对 iOS 8 SpriteKit 中的整个渲染场景进行像素化

    我正在尝试在 SKScene 上创建全屏像素化效果 我了解到应该有两种选择来做到这一点 使用自定义SKShader使用 GLES 2 0 使用核心图像过滤器 我尝试添加一个自定义 SKShader 它应该通过像素化来修改整个屏幕 我不确定是