【问题标题】:Custom blend mode自定义混合模式
【发布时间】:2014-06-12 15:09:40
【问题描述】:

我并没有真正了解glBlendFunc() 函数及其工作原理。

是否有一种混合模式可以让目标黑色变为黑色,同时覆盖任何其他 dst 颜色?

我有一个包含着色边缘和形状的黑白画布。我想在画布上的任何地方画一个画笔,但不要覆盖边缘,这样一旦图像完全着色,它们就会保持黑色。理想情况下,由于目标边缘周围有一些灰色以保持平滑,因此灰色阴影将被画笔颜色着色。

谢谢!

【问题讨论】:

    标签: opengl-es glblendfunc


    【解决方案1】:

    我相信你需要的是glBlendFunc(GL_DST_COLOR, GL_ZERO)

    向您解释混合功能的工作原理: 混合时,您有 2 种颜色,来源和目的地。来源是您尝试应用的颜色(文本,纯色......)。 Destination 是缓冲区中当前的颜色。 glBlendFunc 中的 2 个参数告诉如何将源颜色和目标颜色相乘,然后再将它们相加以获得结果颜色。

    所以在glBlendFunc(GL_DST_COLOR, GL_ZERO) 的情况下,有一个黑白目标缓冲区(如您所描述的)将像这样:

    • 如果目标颜色是白色 (1,1,1,1) 并且您将应用一些颜色,例如 (.1, .2, .3, 1),结果将是 R = (.1, .2, .3, 1)*(1,1,1,1) + (1,1,1,1)*(0,0,0,0) = (.1, .2, .3, 1)
    • 如果目标颜色是黑色 (0,0,0,0) 并且您将应用一些颜色,例如 (.1, .2, .3, 1),结果将是 R = (.1, .2, .3, 1)*(0,0,0,0) + (0,0,0,0)*(0,0,0,0) = (0, 0, 0, 0)
    • 如果目标颜色是灰色 (.5,.5,.5,1.0) 并且您将应用一些颜色,例如 (.1, .2, .3, 1),结果将是 R = (.1, .2, .3, 1)*(.5,.5,.5,1.0) + (.5,.5,.5,1.0)*(0,0,0,0) = (.05, .1, .15, 1)

    您的这种情况有点特殊,但在大多数情况下仅使用 Alpha 通道。例如,最常见的混合是glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA),这意味着源颜色将与源 alpha 相乘,而目标颜色将与 1.0 源 alpha 相乘,因此在灰色背景 RGB 0.5 上的 alpha 为 0.75 的白色形状(任何 alpha) 将导致 RGB all 1.0*.75 + .5*(1.0-.75) = .75 + .125 = .875

    请注意,如果您需要在叠加层上使用其他混合类型,您的此过程可能会花费您。在这种情况下,您将需要查看模板缓冲区。另一个问题是您可能不想在未绘制叠加层的地方看到黑白部分。在这种情况下,您可以简单地使用目标 alpha 为您进行混合:glColorMask 可以帮助您仅绘制到缓冲区的 alpha 通道,您可以将 alpha .0 用于“黑色”区域,将 1.0 用于“白色”区域区域,在缓冲区上绘制形状时,您将使用glBlendFunc(GL_DST_ALPHA, GL_ZERO)

    【讨论】:

    • 谢谢你的详细解释,我开始明白了。最后,我通过使用一个透明层来实现它,该层包含形状并在其后面绘制在一个完全白色的画布上。这样,形状总是可见的,因为它们位于绘图画布的前面。此外,这允许在保持形状完整的同时覆盖颜色。
    猜你喜欢
    • 2016-12-31
    • 2018-10-13
    • 2012-01-31
    • 2022-11-25
    • 2020-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多