- 使用标准混合模式的背景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]; [self 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];
当用户使用第一个有颜色的画笔时,它会如预期地与背景混合。但是当继续使用另一种颜色的画笔覆盖在之前的画笔上时,会出现问题(两个画笔重叠时,边缘变得模糊失去不透明度)。
我尝试了许多混合选项,但是无论如何都找不到正确的方法。
CCRenderTexture是否有特殊的功能,不能像预期那样与自己(以前绘制的内容)混合?
我的用于涂抹的片段着色器只是带有保留输入颜色alpha的纹理标准着色器的轻微更改:
void main() { 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.
和)
[_renderTexture.sprite setBlendFunc:(ccBlendFunc){GL_ONE, GL_ONE_MINUS_SRC_ALPHA}];
这样做非常好,可以得到我想要的效果...但是只有当_rederTexture完全不透明时才有效。
当
_rendertexture.sprite
的不透明度降低时,刷子会变亮,而不是像人们所期望的那样淡出:为什么在父纹理完全不透明时,画笔的alpha值与背景正确混合,但在不透明度降低时却失效?如何使刷子与背景正确混合?