【问题标题】:Blending sprite with pre-existing texture将精灵与预先存在的纹理混合
【发布时间】:2016-05-02 01:54:13
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: opengl


    【解决方案1】:

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

    您想要的是基于 destination 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_barrierping-ponging 进行读取/修改/写入操作。

    【讨论】:

    • 非常感谢,正是我想要的。巧合的是,我正在绘制的精灵确实没有透明胶片(它是桥牌)。史蒂夫
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-20
    • 1970-01-01
    • 1970-01-01
    • 2018-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多