我正在尝试将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);
}

这是一些结果:


如您所见,这是一个很好的近似值,但这两个图像有错误:

-[[EAGLView swapBuffers]] 中的OpenGL错误0x0502

我的问题是:
  • 如何删除或修复此错误?
  • 如何仅保留图像的Alpha(遮罩)并应用混合覆盖颜色?

  • [更新]这是我想要的示例(具有正确的混合):

    最佳答案

    仅在alpha为1.0的情况下将混合模式应用于图像

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

    编辑更新的问题

    所需结果:



    我认为您在此处混合了“乘”和“覆盖”字幕。

    在所有这些情况下,都可以使用

  • glEnable(GL_ALPHA_TEST); glAlphaFunc(GL_GEQUAL, 0.995); //不为某些裕度使用1.0

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

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

    “覆盖”(实际上是乘法)效果对应于GL_MODULATE纹理环境模式。或根据着色器gl_FragColor = texture2D(...) * color;

    “变亮”是min(texture2D(...), color);
    “乘”(实际上是重叠)是gl_FragColor = 1. - (1.-color*texture2D(...))*(1.-color);
    “柔光”是gl_FragColor = (1. - (1.-texture2D(...))*(1.-color))*k + b;(k和b选择的参数)。

    07-28 03:34
    查看更多