带有 SpriteKit 的着色器仅注册黑色的 alpha

Posted

技术标签:

【中文标题】带有 SpriteKit 的着色器仅注册黑色的 alpha【英文标题】:Shader with SpriteKit only register alpha for black color 【发布时间】:2020-04-20 20:21:31 【问题描述】:

我开始在 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)

【问题讨论】:

gl_FragColor 中的结果应该是预乘的 alpha 形式。 它对我有用,所有图像都在 alpha .3 上,一些区域在红色、蓝色和绿色上......imgur.com/a/kvuvguH @Bg2b 你是什么意思?如果我想要一个带有 alpha 0.3 的红色,颜色应该是 (.3,0.,0.,.3)? @Maetschl 您尝试了哪个版本的 iOS?我在 iOS 13、iPhone X 和模拟器上试过。使用 OpenGL 或金属,两者都给了我相同的结果...... 【参考方案1】:

感谢 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 个图像相互混合,但被操纵的图像的颜色是“完整的”。

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

【讨论】:

以上是关于带有 SpriteKit 的着色器仅注册黑色的 alpha的主要内容,如果未能解决你的问题,请参考以下文章

带有片段着色器的 GLSL 仅渲染黑色 GL_POINTS

SpriteKit 着色器未与制服一起运行

使用 SpriteKit 和 Swift 的自定义着色器有一些不同

带有 Blinn-Phong GLSL 着色器、点光源的奇怪结果

iOS10 + SceneKit:使用自定义着色器渲染视频

FBO 的延迟着色器纹理显示为黑色