【问题标题】:OpenGL transparency of black background黑色背景的OpenGL透明度
【发布时间】:2012-06-26 17:56:27
【问题描述】:

我正在使用精灵动画(OpenGL + C++)。 我在进行混合时遇到了一些麻烦。

我正在尝试加载具有黑色背景的图像并将其绘制在另一个纹理上,而图像周围不会出现黑色块。图像具有 Alpha 通道并启用了混合。

我尝试使用不同的混合功能。我最终会得到一个块状图像或半透明图像。

我知道如果我将黑色背景替换为透明色而不是使用图像编辑软件,我可以做到这一点,但我想在没有它并且不使用图像蒙版的情况下让它工作。

一个更好地了解我的情况的例子。

纹理上的图像和图像处理不正确:

我想要的样子:

这是我正在使用的一些代码。我选择了似乎最相关的内容,因为大量代码分散在几个类中。

    glEnable(GL_DEPTH_TEST);
    ....
    ....
    glEnable(GL_TEXTURE_2D);
    /*Drawing the image with black background first*/
    glBindTexture(GL_TEXTURE_2D, blockImage);
    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

    glEnable(GL_BLEND);
    glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
        //drawing code
        ...
    ...
    ...
    /*background texture is drawn last*/
    glBindTexture(GL_TEXTURE_2D, bgImage);
    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

    glBlendFunc(GL_ONE, GL_DST_ALPHA);
    //drawing code
        ...
    glDisable(GL_BLEND);
    glDisable(GL_TEXTURE_2D);

我真的不需要实际的代码来执行此操作。对逻辑的简单解释就足够了(绘制和混合的顺序)。

【问题讨论】:

  • 图像的 Alpha 通道表示会很有帮助。
  • 还有你当前的代码集!!!我的代码完全符合您的要求,在 iPhone / iPad 应用程序上使用 OpenGL ES 完成。我只需要看看你已经拥有什么!!!
  • “我知道如果我将黑色背景替换为透明色而不是使用图像编辑软件,我可以做到这一点,但我想在没有它的情况下让它工作”您是想说黑色背景在源图像中不是 100% 透明吗?如果您要这样做,OpenGL 不支持颜色键控。
  • 啊,是的。这是正确的术语。我希望能够选择用于透明度的颜色键。还有其他方法吗?

标签: opengl background transparency


【解决方案1】:

OpenGL 固定功能管道没有对颜色键控的内置支持。如果你想这样做,你可以写一个着色器来测试片段的颜色,并使用discard操作。

如果您想在固定功能中执行此操作,则必须正确使用 alpha 通道(在预处理中使所有黑色区域 alpha = 0)。

【讨论】:

  • 谢谢。在读取数据后立即转换为 OpenGL 纹理之前更改 Alpha 通道效果很好。
猜你喜欢
  • 2018-04-24
  • 1970-01-01
  • 1970-01-01
  • 2016-02-22
  • 2015-07-04
  • 1970-01-01
  • 2023-03-15
  • 1970-01-01
相关资源
最近更新 更多