我有非常简单的 CCScene,只有 1 个 CCLayer,其中包含:
- CCSprite 用于具有标准混合模式的背景
- CCRenderTexture 绘制画笔,其精灵附加到背景精灵上方的根 CCLayer:
_bgSprite = [CCSprite spriteWithFile:backgroundPath]; _renderTexture = [CCRenderTexture renderTextureWithWidth:self.contentSize.width height:self.contentSize.height]; [_renderTexture.sprite setBlendFunc:(ccBlendFunc){GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA}]; [self addChild:_bgSprite z:-100]; [自我 addChild:_renderTexture];
画笔渲染代码:
[_renderTexture begin];
glBlendFuncSeparate(GL_ONE, GL_ZERO, GL_ONE, GL_ONE); // 1.
// calculate vertices code,etc...
glDrawArrays(GL_TRIANGLES, 0, (GLsizei)count);
[_renderTexture end];
当用户使用第一个彩色画笔刷时,它会按预期与背景混合。但是当在前一个画笔上继续刷另一种颜色时,它会出错(当 2 个画笔相互重叠时,软 alpha 边缘会失去不透明度):
我尝试了许多混合选项,但不知何故我找不到正确的选项。
CCRenderTexture 有什么特别之处,它不会像预期的那样与自身(与先前绘制的内容)融合吗?
我用于刷涂的片段着色器只是标准纹理着色器,稍作更改以保留纹理中的输入颜色 alpha:
无效的主要() { gl_FragColor = texture2D(u_texture, v_texCoord); gl_FragColor.a = v_fragmentColor.a; }
更新 - 几乎完美的解决方案: jozxyqk
glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA,
GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
在渲染代码中(代替// 1.
and
[_renderTexture.sprite setBlendFunc:(ccBlendFunc){GL_ONE, GL_ONE_MINUS_SRC_ALPHA}];
这很好用,给了我想要的东西......
...但仅当 _rederTexture 完全不透明时。
当不透明度_rendertexture.sprite
降低时,画笔会变亮,而不是像预期的那样淡出:
为什么当父纹理完全不透明时,画笔的 alpha 与背景正确混合,但当不透明度降低时会变成香蕉?如何使画笔与背景正确融合?