部分透明,A xor B alpha混合在cocos2d-x?

时间:2014-05-28 09:57:55

标签: opengl-es cocos2d-x alphablending cocos2d-x-3.0

我想在cocos2d-x中混合两个Sprite,而不将这些与基础Layer混合。从Wikipedia article about alpha compositing,我们得到以下图片:

enter image description here

我有兴趣实现“A xor B”类别,第二行(部分透明的A和B)中显示的效果。

我尝试过不同的混合功能,比如

Sprite* sprite1 = Sprite::create("image.png");
BlendFunc bf = { GL_ONE, GL_ZERO };
sprite1->setBlendFunc(bf);

Sprite* sprite2 = Sprite::create("image.png");
BlendFunc bf = { GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA };
sprite2->setBlendFunc(bf);

// Add sprites to layer here

但是我无法想象这会使这种方法有效。我相信我需要深入了解渲染管道才能做到这一点。 :/例如,我在OpenGL论坛上看到了一个声称do what I want的例子。作者使用以下

//clear depthbuffer and render only planes being further in the background
glClearDepth( 0.0 );
glClear( GL_DEPTH_BUFFER_BIT );
glDepthFunc( GL_GREATER );

//disable blending and render only color of the planes  
glDisable( GL_BLEND );
glColorMask( true, true, true, false );

//--> RENDER CONTENT

//reset depthbuffer
glClearDepth( 1.0 );
glClear( GL_DEPTH_BUFFER_BIT );
glDepthFunc( GL_LESS );

//reset to standard blending
glEnable( GL_BLEND );
glColorMask( true, true, true, true );

//--> RENDER CONTENT

他/她将内容渲染两次以获得所需结果。这似乎不是cocos2d-x生态系统中非常可行的路径。有没有办法使用现有的cocos2d-x ver来实现这一点。 3.1渲染管道?

1 个答案:

答案 0 :(得分:1)

好的,所以这很脏。但就目前而言,我将通过添加另一个(相同的)精灵来解决这个问题。像这样:

Sprite* sprite0 = Sprite::create("image2.png");     
// This ensures a lower Z-order than sprite1 and sprite2, 
// but same image and position as sprite2.
sprite0->setBlendFunc(cocos2d::BlendFunc::DISABLE);
Sprite1->setPosition(150.0f, 150.0f);

Sprite* sprite1 = Sprite::create("image1.png");
sprite1->setBlendFunc(cocos2d::BlendFunc::DISABLE);
Sprite1->setPosition(100.0f, 100.0f);

Sprite* sprite2 = Sprite::create("image2.png");
BlendFunc bf = { GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA };
sprite2->setBlendFunc(bf);
Sprite2->setPosition(150.0f, 150.0f);

不漂亮,但完成了工作。