OpenGL透明度的黑色背景

时间:2012-06-25 13:08:10

标签: opengl background transparency

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

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

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

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

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

图像&纹理图像不正确:

enter image description here

我想要它的方式:

enter image description here

这是我正在使用的一些代码。我选择了最相关的东西,因为很多代码分布在几个类中。

    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);

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

1 个答案:

答案 0 :(得分:1)

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

如果你想在固定功能中这样做,你必须正确使用alpha通道(在预处理中使所有黑色区域alpha = 0)。