我正在尝试在 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.
.