【发布时间】:2021-10-15 20:14:27
【问题描述】:
我在尝试为 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 preload 回调中调用。
在模拟器上,这始终如一地给出预期的结果,即。到处都有不同 alpha 值的纹理。在实际的 14.5.1 设备上,它会有所不同:
- 直接应用于 SKSpriteNode - 它使整个纹理具有单值半透明
- 应用于以 SKSpriteNode 作为其子级的 SKEffectNode - 我看到整个 spritesheet 的小型化部分
- 与 2 相同,但纹理是从 spritesheet 外部的图像创建的 - 它的工作原理与模拟器相同(并且符合预期)
为什么会这样?考虑到这需要在 iOS 9 设备上运行,我担心 3 无法在任何地方运行。因此,我想了解为什么会发生这种情况,并且理想情况下要确保强制 1 或至少 2 在所有设备上工作。
【问题讨论】:
标签: ios sprite-kit skspritenode fragment-shader skeffectnode