我想在cocos2d-x中混合两个Sprite
,而不将这些与基础Layer
混合。从Wikipedia article about alpha compositing,我们得到以下图片:
我有兴趣实现“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渲染管道?
答案 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);
不漂亮,但完成了工作。