gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 22:16:50 24 4
gpt4 key购买 nike

我正在尝试在 SKScene 上创建全屏像素化效果。我了解到应该有两种选择来执行此操作:

  • 使用 GLES 2.0 的自定义 SKShader
  • 使用 Core Image 滤镜。

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

An SKEffectNode object renders its children into a buffer and optionally applies a Core Image filter to this rendered output.

可以将 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,它就可以工作。

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

编辑:我找到了一种在 OS X ( How do you add a CIPixellate Core Image Filter to a Sprite Kit scene? ) 中使用 Core Image 过滤器进行像素化的方法,但复制该实现不会在 iOS 上产生任何结果。根据documents CIPixellate 应该是在 OS X v10.4 及更高版本和 iOS 6.0 及更高版本中可用。

最佳答案

为了让你的 .shaderSKScene 上运行,你需要在场景中将 shouldEnableEffects 设置为 true(同样的事情适用于SKEffectNode).

虽然从技术上讲,这“有效”(应用了着色器),但在之后的场景渲染中存在一个错误,它会稍微调整大小。

因此,到目前为止,使用 CoreImage 滤镜是最好的方法。

关于ios - 将自定义 SKShader 应用于 SKScene,使用 Swift 在 iOS 8 SpriteKit 中对整个渲染场景进行像素化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26072230/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com