【问题标题】:Can't get masking to work correctly with OpenGL无法使蒙版与 OpenGL 一起正常工作
【发布时间】:2012-05-11 03:42:08
【问题描述】:

我正在尝试使用 OpenGL 屏蔽图像,使其部分透明。这是我的代码,它不起作用:

draw_img(background);

...

glEnable(GL_BLEND);
glDisable(GL_DEPTH_TEST);
glBlendFunc(GL_ONE, GL_ZERO);
draw_img(mask);
glBlendFunc(GL_DST_ALPHA, GL_ONE_MINUS_DST_ALPHA);

draw_img(foreground);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

这是我正在尝试绘制的背景图片:

下面分别是贴图和蒙版(蒙版中的白色真的是透明的,我只是把它弄平了,你可以看到):

这是我期望得到的:

这就是我实际得到的:

知道可能是什么问题吗?

【问题讨论】:

    标签: c++ opengl masking


    【解决方案1】:

    首先,我认为这不会达到你的预期:

    glBlendFunc(GL_ONE, GL_ZERO);
    draw_img(mask);
    

    这是将蒙版与背景混合,但您说的是“始终采用 100% 的蒙版,始终采用 0% 的目标”。在此步骤之后,帧缓冲区中将不再有红色像素,因为您已将帧缓冲区的所有通道替换为蒙版纹理。

    我猜您可能打算只替换 Alpha 通道,而保持颜色不变?如果在绘制蒙版之前屏蔽颜色通道,则可以使用glColorMask(GL_FALSE,GL_FALSE,GL_FALSE, GL_TRUE);

    我认为如果你这样做,它可能会奏效。

    我认为这种效果通常可以通过 glTexEnv 的多重纹理操作来完成,但如果你不想使用多重纹理,这应该可以。

    【讨论】:

    • 非常感谢!现在我明白为什么会这样了——我以为我的第二个混合错误,但它确实有效,只是先用黑色替换了背景。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-14
    相关资源
    最近更新 更多