作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有非常简单的 CCScene,只有 1 个 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];
Brush rendering code:
[_renderTexture begin];
glBlendFuncSeparate(GL_ONE, GL_ZERO, GL_ONE, GL_ONE); // 1.
// calculate vertices code,etc...
glDrawArrays(GL_TRIANGLES, 0, (GLsizei)count);
[_renderTexture end];
void main(){ gl_FragColor = texture2D(u_texture, v_texCoord); gl_FragColor.a = v_fragmentColor.a;}
UPDATE - ALMOST PERFECT SOLUTION : by 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}];
_rendertexture.sprite
降低,画笔变亮而不是像人们预期的那样淡出:
最佳答案
编辑
混合画笔 -> 图层 -> 背景
好的,发生的事情是 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)
正在努力将画笔描边混合到画笔纹理中,但纹理中产生的 alpha 值是错误的。每个添加的片段都需要 1. 将它的 alpha 添加到最终的 alpha 值 - 它必须完全移除交互作用的那么多光,并且 2. 将之前的 alpha 缩放到剩余部分 - 之前的表面将光减少了之前的值,但是由于添加了一个新的表面,减少了它们减少的光线。我不确定这是否有意义,但它导致了这个......
glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA,
GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA
再次与 alpha 缩放,从而使整体颜色变暗。您现在需要使用以下函数将画笔纹理与背景混合,我认为必须在 Cocos2D 中设置:
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA
混合的可能性。但它可能需要浮点纹理和/或额外的 channel 来划分/规范化 alpha,这听起来很痛苦。
glDisable(GL_DEPTH_TEST);
glClear(GL_COLOR_BUFFER_BIT);
glEnable(GL_TEXTURE_2D);
glEnable(GL_BLEND);
fbo.bind();
glClear(GL_COLOR_BUFFER_BIT);
glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA,
GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
drawTexture(brush1);
drawTexture(brush2);
fbo.unbind();
drawTexture(grassTex); //tex alpha is 1.0, so blending doesn't affect background
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
drawTexture(fbo.getColour(0)); //blend in the brush layer
GL_ONE, GL_ONE_MINUS_SRC_ALPHA
导致库在图层混合中实现不透明度的问题,因为它假定颜色乘以 alpha。通过减少
opacity
值,画笔层的 alpha 在混合过程中按比例缩小。
GL_ONE_MINUS_SRC_ALPHA
然后导致背景颜色的数量增加,但是
GL_ONE
将画笔层的 100% 相加并使图像过饱和。
GL_ONE, GL_ONE_MINUS_SRC_ALPHA
.
GL_CONSTANT_COLOR, GL_ONE_MINUS_SRC_ALPHA
如果图书馆支持它,可能是一个答案,但显然它不支持。 glColor4f(opacity, opacity, opacity, opacity)
,但这将需要第二个渲染目标并手动进行混合,类似于上面的代码,您为背景绘制一次全屏四边形,然后再次为画笔层绘制。 glColor
会更健壮。方法。如果您想使用更复杂的混合函数,这将允许更大的控制,尤其是在涉及 0 到 1 范围之外的分区和临时性时:gl_FragColour = texture(brushTexture, coord) * layerOpacity;
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
,不完全是 GL 的“初始”/默认功能。
glBlendFunc(GL_SRC_ALPHA_SATURATE, GL_ONE)
.也可能值得尝试
glBlendEquationSeparate和 MAX 混合(如果支持)。使用 MAX 的好处是减少线条绘制代码中的重叠伪影(硬三角位) - 例如替换颜色,但仅在达到总 alpha 值 X 之前。编辑:这两种情况都需要在每次中风后混合和清除。
glBlendEquation(GL_FUNC_ADD);
glBlendFuncSeparate(GL_DST_ALPHA, GL_ONE, GL_ZERO, GL_ONE_MINUS_SRC_ALPHA);
关于iPhone OpenGL ES 2.0 与 Cocos2D 混合给出了意想不到的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18735542/
我是一名优秀的程序员,十分优秀!