Opengl,仅当目标像素的 alpha 值为正时才混合

Posted

技术标签:

【中文标题】Opengl,仅当目标像素的 alpha 值为正时才混合【英文标题】:Opengl, blend only when destination pixels' alpha value is positive 【发布时间】:2016-04-19 08:16:46 【问题描述】:

我正在寻找一种功能/方法来使混合仅在目标像素(即后台缓冲区)的 alpha 值大于 0 时起作用。

我正在寻找类似于 glAlphaFunc 的东西,它测试传入的片段,但在我的情况下,我想测试已经在后台缓冲区中找到的片段。

有什么想法吗?

提前谢谢你

ps。我无法在绘图函数中进行逐像素测试,因为它被设置为用户的回调函数。

【问题讨论】:

你试过glBendFunc吗? 定义“使混合工作”。你已经有混合功能了吗?也就是说,你是结合源颜色和目标颜色,还是只是想根据目标 alpha 是否大于零有条件地写入源颜色? 我正在尝试实现第二个,即根据目标 alpha 是否大于零有条件地写入源颜色。我要做的是在各种纹理上保存后台缓冲区,并根据需要使用混合函数(GL_SOURCE_ALPHA、GL_ONE_MINUS_SOURCE_ALPHA)在后台缓冲区上重绘它们(很可能会用其他东西重绘)。 根据定义,alpha 值为 [0..1]。所以总是积极的。也许解释你想做什么,而不是你想怎么做。 【参考方案1】:

等等,你的回答有点令人困惑,但我认为你正在寻找的是这样的:opengl - blending with previous contents of framebuffer

【讨论】:

【参考方案2】:

对此感到抱歉,但我认为最好回答而不是评论。

所以,让我举个例子更好地解释一下。

假设我们必须绘制一些东西(无论用户想要什么,比如一张桌子),然后(当然是在交换缓冲区之前)我们必须使用混合在它上面绘制“保存”的纹理。

假设我们要绘制两个透明的盒子。如果要将这些框保存在不同的纹理中,可以通过以下方式完成:

    用 (0, 0, 0, 0) 清屏 设置混合函数(GL_ONE、GL_ZERO) 画框 将其保存到纹理中。

现在,每当用户想要全部重绘它们时,他只需绘制主题(表格),然后使用混合函数(GL_SOURCE_ALPHA、GL_ONE_MINUS_SOURCE_ALPHA)在其上绘制纹理。

这很好用。但是如果用户想要将两个框保存在一个纹理中并且框重叠,我们如何保存这两个框的混合而不将它们与“清除”背景混合?

总而言之,整幅画的最终图像应该是一张桌子,上面有两个盒子(比如说一个黄色和一个绿色盒子),并与函数(GL_SOURCE_ALPHA、GL_ONE_MINUS_SOURCE_ALPHA)混合。

【讨论】:

以上是关于Opengl,仅当目标像素的 alpha 值为正时才混合的主要内容,如果未能解决你的问题,请参考以下文章

渲染管道像素阶段“Alpha混合”

渲染管道像素阶段“Alpha混合”

使用 SIMD,我如何有条件地仅移动 alpha 通道值为 255 的像素?

将 GLubyte* 转换为 GLuint* 用于 alpha 纹理 Opengl 3.0 / c++ / Win32

Android OpenGL 纹理/对象检测

OpenGL Stencil - 排除透明像素