Opengl es 部分透明,cocos2d-x中的xor Bα混合?

Opengl es 部分透明,cocos2d-x中的xor Bα混合?,opengl-es,cocos2d-x,alphablending,cocos2d-x-3.0,Opengl Es,Cocos2d X,Alphablending,Cocos2d X 3.0,我想在cocos2d-x中混合两个Sprites,而不必与底层层混合。从中,我们可以看到以下图像: 我对实现“A xor B”类别第二行(部分透明的A和B)中显示的效果感兴趣 我尝试过不同的混合函数,比如 Sprite* sprite1 = Sprite::create("image.png"); BlendFunc bf = { GL_ONE, GL_ZERO }; sprite1->setBlendFunc(bf); Sprite* sprite2 = Sprite::creat

我想在cocos2d-x中混合两个
Sprite
s,而不必与底层
层混合。从中,我们可以看到以下图像:

我对实现“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论坛上看到了一个例子,它声称是。作者使用了以下方法

//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版本实现这一点。3.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);
不太漂亮,但工作完成了