首页 > 解决方案 > 带有 SpriteKit 的着色器仅注册黑色的 alpha

问题描述

我开始在 iOS 上使用带有 SpriteKit 的着色器。这真是一段旅程……

现在我有一些奇怪的行为。

我试图创建一个外部发光着色器。所以我的目标是修改透明像素的颜色和alpha,使其不那么透明并使用特定的颜色,而我无法达到它的透明度级别。所以我挖掘并创建了以下内容:

我根据 alpha 级别更改像素的颜色并将 0 应用于 alpha 通道。

我希望整个图像是透明的。但不是!一切都是完全可见的。

现在,如果我将任何颜色更改为 black vec3(0.,0.,0.);,图片结果将显示具有透明度的黑色。

你知道为什么会这样吗?最终如何解决?

下面是创建节点的代码:

let sp = SKSpriteNode(imageNamed: "EmptyCapsule")
let myShader = SKShader(fileNamed: "WIP")
sp.shader = myShader
sp.anchorPoint = CGPoint(x: 0, y: 0)
addChild(sp)

标签: iosswiftopengl-essprite-kit

解决方案


感谢 bg2b,我测试了预乘 alpha,结果符合预期。我不知道是否有首选方法,但我最终得到的是:

vec4 color = texture2D(u_texture, v_tex_coord);
if(color.a == 1.)
{
    color.rgb = vec3(1.,0.,0.);
}else if(color.a > .6)
{
    color.rgb = vec3(0.,1.,0.);
}

else if(color.a == 0.)
{
    color.rgb = vec3(0.,0.,1.);
}
color.a = .9;
gl_FragColor = vec4(color.rgb*color.a, color.a);

需要注意的是:当我没有预乘 alpha 时,alpha 仍然用于混合 SpriteKit 的不同对象。我在我正在操作的那个下添加了另一个 SKSpriteNode,两个图像相互混合,但被操纵的图像的颜色是“完整的”。

此外,在这个例子中,我没有使用SKDefaultShading();来选择像素的颜色。当我这样做时,在这种情况下没有区别。但是,如果我们直接在对象上更改 SKSpriteNode 的 alpha,则无 alpha 像素会保持原始颜色,而另一个像素会采用着色器中使用的颜色...


推荐阅读