黑色背景下的OpenGL透明度

3
我正在使用精灵动画(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);

我并不需要实际的代码来完成这个任务。简单解释一下逻辑就足够了(绘制和混合的顺序)。


2
图像的alpha通道的表示将会很有帮助。 - Luca
还有你当前的代码!!!我有一段代码,使用OpenGL ES在iPhone / iPad应用程序上完成了您要求的功能。我只需要看看你已经有什么了!!! - trumpetlicks
1
“我知道如果使用图像编辑软件将黑色背景替换为透明颜色,我可以做到这一点,但我希望在不使用它的情况下使其正常工作。”你是想说源图像中的黑色背景不是完全透明吗?如果是这样,OpenGL不支持颜色键控技术。” - Tim
啊,没错。我想能够选择一个颜色键来用于透明度。还有其他的方法吗? - Nathan Morgan
1个回答

1

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

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


谢谢。在读取数据后立即更改 alpha 通道,然后转换为 OpenGL 纹理效果非常好。 - Nathan Morgan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接