【问题标题】:OpenGL - Textures - Replacing black (white) with colorOpenGL - 纹理 - 用颜色替换黑色(白色)
【发布时间】:2011-04-23 06:22:37
【问题描述】:

我正在使用 Cairo/Pango 为带有 OpenGL 的文本显示生成位图。我将位图生成为具有透明背景的 RGBA,文本为黑色或白色。 (让我们假设黑色。)

如果我将此位图加载为 OpenGL 纹理并显示它,它会按预期显示为黑色文本或白色文本。

我希望能够仅使用原始纹理为文本着色,但由 OpenGL 负责着色。

最好用 glColor 来设置颜色,但我更愿意使用 glBlendColor 或 GL_TEXTURE_ENV_COLOR。

但是,我无法让这些选项中的任何一个起作用。

我尝试过无数种组合 - 白色文本或黑色文本 - 启用混合或使用 GL_TEXTURE_ENV_MODE 的 GL_BLEND - 尝试 GL_MODULATE、GL_REPLACE 和 GL_COMBINE - 尝试各种不同的 glBlendFunc 组合

我已经在网上搜索并阅读了几个小时的规范,但我真的走到了尽头。

谁能给我指出正确的地方来得到这个问题的答案?

【问题讨论】:

    标签: opengl


    【解决方案1】:

    最简单的方法是使用带有白色文本和透明背景的文本位图。

    然后,要为它着色,您必须确保将 TEXTURE_ENV_MODE 设置为 MODULATE :

    glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
    

    这样,绘制颜色将是 glColor * textureColor == glColor(因为 textureColor 是白色的)

    然后你必须启用混合来处理你的透明背景:

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

    ,如果您的位图是预乘 alpha 形式:

    glEnable(GL_BLEND);
    glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
    

    【讨论】:

    • 这个答案很有帮助。它帮助我找到了最大的问题,这几乎就是我是个白痴……通常当我使用 glColor 时,我会为不透明的红色做 glColor(1.,0.,0.,0.) 之类的事情。这就是我之前所做的......但最后的 0. 将整个纹理上的 alpha 设置为 0。(因为它正在被相乘。)我真的需要使用 glColor(1.,0.,0.,1 .) 这样无论纹理中的 alpha 是什么,都会生效。哇,我觉得自己很笨。
    【解决方案2】:

    不是提供完整的 RGBA 集,而是让文本仅确定非/透明度,即仅提供 Alpha 通道。然后用普通的glColor设置文字颜色。

    【讨论】:

    • 以及如何做到这一点?这正是我正在寻找的
    • @ProkopHapala:将字形光栅化为灰度格式,并将其上传到 GL_ALPHA 格式纹理(固定函数 OpenGL)或 GL_RED 格式纹理,并在片段着色器中将纹理的 R 分量分配给 A输出片段的组成部分。
    • aha,好的,使用fragmet shader 可能很容易(虽然我没有测试过),但我现在正在尝试使用老式的GLthis question
    【解决方案3】:

    听起来您可以根据需要创建位图。如果是这种情况,我会将文本绘制到 Alpha 通道中,而不是白底黑字。然后为文本着色,绘制所需颜色的矩形(或其他)。然后在它上面画出你的纹理。在纹理不透明的地方,您将获得纹理颜色。纹理透明的地方,背景颜色会透出来。

    为此,您必须设置glBlendFunc。平时应该没问题:

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

    您还必须为纹理打开混合:

    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_BLEND);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-20
      • 1970-01-01
      • 2012-02-07
      • 2013-08-29
      • 2012-09-26
      • 2014-06-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多