带有 SpriteKit 的着色器只为黑色注册 alpha
Shader with SpriteKit only register alpha for black color
我开始在 iOS 上使用带有 SpriteKit 的着色器。这是一段相当长的旅程...
现在我有一些奇怪的行为。
我试图创建一个外发光着色器。所以我的目标是将透明像素的颜色和 alpha 修改为不太透明并具有特定颜色,但我无法达到它的透明度级别。
所以我挖掘并创建了以下内容:
- 我将具有不同 alpha 级别(主要是 0 和 1)的纹理加载到
SKSpriteNode
- 应用着色器。
着色器如下:
#ifdef GL_ES
precision mediump float;
#endif
void main() {
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 = .3;
gl_FragColor = color;
}
我根据 alpha 级别更改像素的颜色并将 0 应用于 alpha 通道。
我希望整个图像是透明的。但不是!一切都完全可见。
现在,如果我将任何颜色更改为黑色 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)
感谢 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,并且 2 个图像相互混合但操纵图像的颜色是 "full"。
此外,在这个例子中我没有使用SKDefaultShading();
来选择像素的颜色。当我这样做时,在这种情况下没有区别。然而,如果我们直接在对象上更改 SKSpriteNode 的 alpha,none alpha 像素将保留原始颜色,而另一个采用着色器中使用的颜色...
我开始在 iOS 上使用带有 SpriteKit 的着色器。这是一段相当长的旅程...
现在我有一些奇怪的行为。
我试图创建一个外发光着色器。所以我的目标是将透明像素的颜色和 alpha 修改为不太透明并具有特定颜色,但我无法达到它的透明度级别。 所以我挖掘并创建了以下内容:
- 我将具有不同 alpha 级别(主要是 0 和 1)的纹理加载到
SKSpriteNode
- 应用着色器。
着色器如下:
#ifdef GL_ES precision mediump float; #endif void main() { 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 = .3; gl_FragColor = color; }
我根据 alpha 级别更改像素的颜色并将 0 应用于 alpha 通道。
我希望整个图像是透明的。但不是!一切都完全可见。
现在,如果我将任何颜色更改为黑色 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)
感谢 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,并且 2 个图像相互混合但操纵图像的颜色是 "full"。
此外,在这个例子中我没有使用SKDefaultShading();
来选择像素的颜色。当我这样做时,在这种情况下没有区别。然而,如果我们直接在对象上更改 SKSpriteNode 的 alpha,none alpha 像素将保留原始颜色,而另一个采用着色器中使用的颜色...