【问题标题】:Keeping original colors保持原色
【发布时间】:2012-07-22 11:20:27
【问题描述】:

我正在尝试在 OpenGL 中的另一个纹理上放置一个纹理(带有 alpha)。我这样做没有任何问题,但这不是我想要的:我的最近的图像的颜色受到背景图像(最远的纹理)的强烈影响,尽管出现橙色的红色。

任何人都知道可以解决此问题的混合(或摆脱 alpha)方法吗?

混合初始化:

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

绘画场景:

glClear(GL_COLOR_BUFFER_BIT);
glLoadIdentity();

//furthest image (background)
glBindTexture(GL_TEXTURE_2D, texture[1]);
glBegin(GL_QUADS);
    glTexCoord2f(0, 0); glVertex2f(0, 0);
    glTexCoord2f(1, 0); glVertex2f(500, 0);
    glTexCoord2f(1, 1); glVertex2f(500, 500);
    glTexCoord2f(0, 1); glVertex2f(0, 500);
glEnd();

//nearest image (appears orange, should be red) 
glBindTexture(GL_TEXTURE_2D, texture[0]);
glBegin(GL_QUADS);
    glTexCoord2f(0, 0); glVertex2f(100, 100);
    glTexCoord2f(1, 0); glVertex2f(300, 100);
    glTexCoord2f(1, 1); glVertex2f(300, 300);
    glTexCoord2f(0, 1); glVertex2f(100, 300);
glEnd();

glutSwapBuffers();

编辑。 这是一张描述其外观的图像:

这是它的外观图片:

【问题讨论】:

  • 我看不出你在混合什么颜色,你想要达到什么效果,以及你实际达到什么效果。如果最近的图像是透明的,为什么它不会受到背景的影响?橙色有什么问题?
  • @Kos 好吧,我有一个背景是绿草,我有一个红色纹理,其中有使用 alpha 的点。在那些地方我想提到背景(草)。这就像 2D 游戏,玩家在表面上行走。相反,我的背景颜色会影响“玩家”,因此我的红色纹理变成橙色(红色 + 绿色)。

标签: opengl textures glut alpha blending


【解决方案1】:

我相信您想要的是“alpha 测试”,而不是混合。见

glEnable(GL_ALPHA_TEST)
glAlphaFunc()

如果你想启用混合,你应该使用

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 

这只会在源 alpha 为 1 的地方使用源颜色。目前您的函数将源颜色添加到背景颜色中。

如果您不想混合任何颜色,那么使用 alpha 测试是更好的方法,因为它使用的资源比混合要少。

【讨论】:

  • 这也不起作用。它在我的纹理周围(围绕那个 R 字母)创建黑色表面。
  • 听起来您的图像的 Alpha 通道丢失或损坏。 @Robin92
  • 你是对的!将我的纹理重新保存为 PNG(原为 BMP)解决了一个问题。谢谢 :) @Tim
【解决方案2】:

这个混合函数

glBlendFunc(GL_SRC_ALPHA, GL_ONE);

是你的问题的原因。目标的GL_ONE 意味着,无论 alpha 值如何,帧缓冲区中已经存在的任何内容都将添加到传入的颜色中。

在您的情况下,您的红色纹理会添加绿色背景。因为 red + greenish = orange 这就是你得到的。

您想要的是用您的 Alpha 通道屏蔽目标帧缓冲区中的先前内容,这是使用

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

还请记住,OpenGL 状态是根据需要设置和重置的,因此在绘制其他纹理时,您可能需要其他设置来进行混合和混合功能。

【讨论】:

    【解决方案3】:

    在大家的帮助下,我设法通过以下方式解决了这个问题:

    • 将我的纹理重新保存为 PNG(尽管有 BMP)
    • 将混合功能更改为glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

    感谢所有贡献者:)

    【讨论】:

      猜你喜欢
      • 2011-10-14
      • 2021-12-05
      • 2013-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-19
      • 1970-01-01
      • 2022-09-27
      相关资源
      最近更新 更多