黑色背景的OpenGL透明度

标签 opengl background transparency

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

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

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

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

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

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

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

我真的不需要实际的代码来做到这一点。对逻辑的简单解释就足够了(绘制和混合的顺序)。

最佳答案

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

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

关于黑色背景的OpenGL透明度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11189996/

相关文章:

jquery - 使用 Opera 加载 jQuery 后

HTML 不在我的页眉中显示背景颜色

php - 使用 gdlib 复制透明 PNG

c++ - openGL 中带有/对象的静态背景。 "bake"的最佳方式?

c++ - 绕轴旋转相机?

java - 不支持 TrueTypeFont.drawString()

java - 使用透明图像的 AWT 自定义窗口形状

opengl - 视频的GPU内存分配

css - 破折号:数字小部件背景颜色

Android - 覆盖布局强制按钮元素透明