【问题标题】:Overlay Color Blend in OpenGL ES / iOS / Cocos2dOpenGL ES / iOS / Cocos2d 中的叠加颜色混合
【发布时间】:2012-01-07 17:01:49
【问题描述】:

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

}

*Draw helper 是绘制三角形的逻辑。

+(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 在 -[EAGLView swapBuffers]

我的问题是:

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

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

【问题讨论】:

  • 您能添加一张您想要的“photoshopped”图像吗?当我与艺术家一起工作时,从包含所有图层的 Photoshop 文件中制作着色器或后处理过滤器比文字描述要容易得多。你知道,一张图片 → 1000 字。
  • 完成@datenwolf,希望对您有所帮助。
  • 如果您打算在应用程序中使用该横幅,请注意:足球队的横幅是商标。您不得以任何您希望的方式使用它们。例如,以宣传您的应用程序或使其看起来正式或类似的方式使用横幅很可能是商标侵权。一些合理使用可能适用,例如在体育应用程序中使用球队横幅显示联赛结果,但即便如此也可能需要获得 FIFA、UEFA 或其他组织的批准。
  • 不,这只是测试资产 :) 感谢@LearnCocos2D 的建议

标签: iphone ios opengl-es cocos2d-iphone


【解决方案1】:

仅对 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选择参数)。

【讨论】:

  • 是的,你在混合模式上是对的(更新)我现在不能让它工作,似乎 alpha 不起作用但我是新手,所以这可能是我的错。似乎着色器会是一个更好的选择,对吧?我不知道我是否能够将它应用到 Cocos2D 但我会继续尝试我需要更多关于事物如何渲染/计算的信息
  • 您的叠加功能可能有效,但效果与 Photoshop 不同。 Photoshop 公式是((base.r < 0.5) ? (2.0 * base.r * overlay.r) : (1.0 - 2.0 * (1.0 - base.r) * (1.0 - overlay.r))),... 我正在尝试用透明和半透明像素覆盖纹理,这些区域的结果几乎是黑色的。有什么想法吗?
  • @Dex:其中有一个条件。你需要一个着色器(好吧,你可以使用非常复杂的多通道方法,为什么要麻烦?)
  • 是的,我正在使用着色器,但结果与预期不符。透明区域看起来几乎是黑色的。您发布的方法也有一个黑暗的结果。这可能是因为我的纹理使用的是 PNG?
  • 我还发现的另一件事是 GL_ALPHA_TEST 在 OpenGL ES 2 中不再可用
猜你喜欢
  • 2014-04-09
  • 1970-01-01
  • 2012-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-16
相关资源
最近更新 更多