我只是在学习OpenGL的复杂性。我想要做的是将一个精灵渲染到预先存在的纹理上。纹理将由具有一些点α= 1和一些点α= 0的地形组成。我希望精灵出现在纹理的像素上,当且仅当相应纹理的像素的alpha = 0.也就是说,对于精灵的每个像素,输出颜色为:
精灵的颜色,如果地形alpha = 0。
地形颜色,如果地形alpha = 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进行读取/修改/写入操作。