【发布时间】:2014-06-12 15:09:40
【问题描述】:
我并没有真正了解glBlendFunc() 函数及其工作原理。
是否有一种混合模式可以让目标黑色变为黑色,同时覆盖任何其他 dst 颜色?
我有一个包含着色边缘和形状的黑白画布。我想在画布上的任何地方画一个画笔,但不要覆盖边缘,这样一旦图像完全着色,它们就会保持黑色。理想情况下,由于目标边缘周围有一些灰色以保持平滑,因此灰色阴影将被画笔颜色着色。
谢谢!
【问题讨论】:
标签: opengl-es glblendfunc
我并没有真正了解glBlendFunc() 函数及其工作原理。
是否有一种混合模式可以让目标黑色变为黑色,同时覆盖任何其他 dst 颜色?
我有一个包含着色边缘和形状的黑白画布。我想在画布上的任何地方画一个画笔,但不要覆盖边缘,这样一旦图像完全着色,它们就会保持黑色。理想情况下,由于目标边缘周围有一些灰色以保持平滑,因此灰色阴影将被画笔颜色着色。
谢谢!
【问题讨论】:
标签: opengl-es glblendfunc
我相信你需要的是glBlendFunc(GL_DST_COLOR, GL_ZERO)。
向您解释混合功能的工作原理:
混合时,您有 2 种颜色,来源和目的地。来源是您尝试应用的颜色(文本,纯色......)。 Destination 是缓冲区中当前的颜色。 glBlendFunc 中的 2 个参数告诉如何将源颜色和目标颜色相乘,然后再将它们相加以获得结果颜色。
所以在glBlendFunc(GL_DST_COLOR, GL_ZERO) 的情况下,有一个黑白目标缓冲区(如您所描述的)将像这样:
R = (.1, .2, .3, 1)*(1,1,1,1) + (1,1,1,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)
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)。
【讨论】: