在OpenGL ES / iOS / Cocos2d中叠加颜色混合

我正在尝试将BlendModes应用于GreyScale图像,以便拥有可重用的静态资源

我一直在网上搜索几个小时,我做了自己的测试,但我没有找到任何解决方案。

我从这张图片开始:

在此处输入图像描述

并且基本思想是以特定颜色在其上绘制矩形,并且仅在alpha为1.0的情况下将混合模式应用于图像

这是代码(这是Cocos2d项目的一部分,虽然我认为它可以应用于通用OGL ES):

-(void)draw { [super draw]; glBlendColor(0,255,0,255); glBlendFunc(GL_ZERO, GL_SRC_COLOR); glColor4ub(255, 0, 255, 255); glLineWidth(2); CGPoint vertices2[] = { ccp(0,100), ccp(100,100), ccp(100,0) }; [ DrawingHelper drawPolygonWithPoints:vertices2 points:3 closePolygon:YES]; } 

*绘制助手是绘制三角形的逻辑。

 +(void)drawPolygonWithPoints:(CGPoint *)poli points:(int)points closePolygon:(BOOL)closePolygon { glDisable(GL_TEXTURE_2D); glDisableClientState(GL_TEXTURE_COORD_ARRAY); glDisableClientState(GL_COLOR_ARRAY); glVertexPointer(2, GL_FLOAT, 0, poli); if( closePolygon ) glDrawArrays(GL_TRIANGLE_FAN, 0, points); else glDrawArrays(GL_LINE_STRIP, 0, points); glEnableClientState(GL_COLOR_ARRAY); glEnableClientState(GL_TEXTURE_COORD_ARRAY); glEnable(GL_TEXTURE_2D); } 

这里有一些结果:

在此处输入图像描述在此处输入图像描述

你可以看到一个很好的近似,但这两个图像有错误:

OpenGL错误0x0502 in – [EAGLView swapBuffers]

我的问题是:

  1. 如何删除或修复此错误?
  2. 如何只保留图像的alpha(屏蔽)并应用混合叠加颜色?

[更新]这是我想要的一个例子(使用正确的混合):

在此处输入图像描述

仅在alpha为1.0的位置将混合模式应用于图像

这听起来像是alpha测试的应用程序。 只有我首先绘制矩形,然后使alpha测试失败等于1.0(或大于0.99以允许一些余量)。 这不需要混合。


编辑更新的问题

期望的结果:

在此处输入图像描述

我认为你混淆了Multiply和Overlay字幕。

在所有这些情况下,这都是使用其中之一完成

  • glEnable(GL_ALPHA_TEST); glAlphaFunc(GL_GEQUAL, 0.995); //没有使用1.0的余地

要么

  • glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

效果不是通过设置混合function或模式创建的,而是通过纹理环境或着色器创建的。

Overlay ”(实际上是乘法)效果对应于GL_MODULATE纹理环境模式。 或者在着色器方面gl_FragColor = texture2D(...) * color;

Lighten ”是min(texture2D(...), color);

乘法 ”(实际上是叠加)是gl_FragColor = 1. - (1.-color*texture2D(...))*(1.-color);

柔光 ”是gl_FragColor = (1. - (1.-texture2D(...))*(1.-color))*k + b; (k和b选择参数)。