Ios SpriteKit中的默认混合是如何工作的?

Ios SpriteKit中的默认混合是如何工作的?,ios,opengl-es,sprite-kit,fragment-shader,alphablending,Ios,Opengl Es,Sprite Kit,Fragment Shader,Alphablending,我第一次开始修补SpriteKit(Xcode 7.1 iOS9),我看到了一些意想不到的结果(在设备和模拟器上) 我希望能够通过着色器将精灵中的像素设置为完全透明,但由于某些原因,这并不像我预期的那样有效 下面是一个ViewController示例: class ViewController: UIViewController { @IBOutlet var sceneView: SKView! private var scene = SKScene() overri

我第一次开始修补SpriteKit(Xcode 7.1 iOS9),我看到了一些意想不到的结果(在设备和模拟器上)

我希望能够通过着色器将精灵中的像素设置为完全透明,但由于某些原因,这并不像我预期的那样有效

下面是一个ViewController示例:

class ViewController: UIViewController {
    @IBOutlet var sceneView: SKView!
    private var scene = SKScene()

    override func viewDidLoad() {
        super.viewDidLoad()
        sceneView.showsDrawCount = true
        sceneView.showsNodeCount = true
        sceneView.showsFPS = true
        scene.scaleMode = .ResizeFill
        scene.backgroundColor = UIColor.redColor()
        let node = SKSpriteNode()
        node.size = CGSizeMake(64, 64)
        node.position = CGPointMake(64, 64)
        node.shader = SKShader(fileNamed: "Test")
        scene.addChild(node)
    }

    override func viewWillAppear(animated: Bool) {
        super.viewWillAppear(animated)
        self.view.layoutIfNeeded()
        sceneView.presentScene(scene)
    }
}
下面是一个示例着色器:

void main()
{
    if (v_tex_coord.x < 0.5) {
        gl_FragColor = vec4(0.0, 1.0, 0.0, 0.0);
    } else {
        gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0);
    }
}
(左侧为红色,右侧为绿色)

我尝试在节点上手动设置混合模式,但没有任何区别

这是一个错误,还是我遗漏了一些明显的东西


谢谢你的帮助。

当然,我的问题有一个简单的解释。在gl_FragColor中返回的颜色应具有预先乘以的alpha。因此,与其返回颜色值:

gl_FragColor = vec4(0.0, 1.0, 0.0, 0.0);
gl_FragColor = vec4(0.0, 0.0, 0.0, 0.0);
我应该返回以下颜色值:

gl_FragColor = vec4(0.0, 1.0, 0.0, 0.0);
gl_FragColor = vec4(0.0, 0.0, 0.0, 0.0);

我错误地认为零alpha表示颜色分量被忽略。

谢谢,@antsyawn!这个预乘要求也让我感到惊讶。花了一些时间试图理解WTF。你有苹果提到的文档吗?对不起,我在上面找到了一些文档,但我不记得它们现在在哪里。它可能没有出现在苹果的文档中,而是出现在OpenGL着色器文档等+1中——我发现苹果提到:“你的着色器应该定义一个main()函数。此函数必须将gl_FragColor变量设置为要在混合阶段中使用的颜色值;通常,此变量中返回的颜色值应已被片段的alpha值预乘