我在尝试为 iOS spritekit 创建溶解着色器时遇到了奇怪的行为。我有这个基本着色器,现在只根据噪声纹理的黑色值改变纹理的 alpha:
let shader = SKShader(source: """
void main() {\
vec4 colour = texture2D(u_texture, v_tex_coord);\
float noise = texture2D(noise_tex, v_tex_coord).r;\
gl_FragColor = colour * noise;\
}
""", uniforms: [
SKUniform(name: "noise_tex", texture: spriteSheet.textureNamed("dissolve_noise"))
])
请注意,此代码在spriteSheet
预加载回调中调用。
在模拟器上,这始终如一地给出预期的结果,即。到处都有不同 alpha 值的纹理。在实际的 14.5.1 设备上,它会有所不同:
- 直接应用于 SKSpriteNode - 它使整个纹理半透明,具有单个值
- 应用于以 SKSpriteNode 作为其子级的 SKEffectNode - 我看到整个 spritesheet 的小型化部分
- 与 2 相同,但纹理是从 spritesheet 外部的图像创建的 - 它在模拟器上工作(和预期的一样)
为什么它会这样?考虑到这需要在 iOS 9 设备上运行,我担心 3 无法在任何地方运行。因此,我想了解它为什么会发生,并且理想情况下要确保强制 1 或至少 2 在所有设备上工作。