将精灵与预先存在的纹理混合

时间:2016-02-25 00:16:17

标签: opengl

我只是在学习OpenGL的复杂性。我想要做的是将一个精灵渲染到预先存在的纹理上。纹理将由具有一些点α= 1和一些点α= 0的地形组成。我希望精灵出现在纹理的像素上,当且仅当相应纹理的像素的alpha = 0.也就是说,对于精灵的每个像素,输出颜色为:

精灵的颜色,如果地形alpha = 0。

地形颜色,如果地形alpha = 1。

这可能与混合功能有关,如果不是我应该怎么做?

1 个答案:

答案 0 :(得分:1)

这与传统的混合功能完全相反。通常的混合函数是源颜色和目标颜色之间的线性插值,基于源alpha。

您想要的是基于目标 alpha的源颜色和目标颜色之间的线性插值。但是你也想要颠倒通常的含义;目标alpha值为1意味着应该采用目标颜色,而不是源颜色。

这很简单。

glBlendFunc(GL_ONE_MINUS_DST_ALPHA, GL_DST_ALPHA);

然而,上面假设你的精灵本身并没有一些固有的透明度。大多数精灵都这样做。也就是说,如果精灵alpha在某个像素处为0,则无论地形的alpha是什么,您都不希望覆盖地形颜色。

这使整个过程变得非常困难。预先乘以alpha也不会保存你,因为如果那里没有地形颜色,黑色就会轻易覆盖地形中的颜色。

实际上,您需要既不基于源也不基于目标进行线性插值,而是根据它们的组合进行线性插值。我认为两者的乘法(src-alpha *(1 - dst-alpha))会做得很好。

OpenGL的standard blending system无法做到这一点。您需要采用某种形式的编程混合技术。这通常涉及在绑定纹理之间使用NV/ARB_texture_barrier或其他ping-ponging进行读取/修改/写入操作。