【问题标题】:How can I blend two colours to a mix of them in OpenGL?如何在 OpenGL 中混合两种颜色?
【发布时间】:2014-05-04 14:23:55
【问题描述】:

我正在渲染一条蓝线和一条红线(在立体图的上下文中)。当红线和蓝线重叠时,我想要呈现紫色而不是前面的线。

我正在使用 OpenGL。到目前为止我尝试过的一些代码是这样的:

glBlendFunc(GL_ONE, GL_DST_ALPHA);

这会导致重叠呈现白色,线条显示如下:

我认为在这种混合上使用 RGB 比例因子可能是正确的做法。

所以我尝试使用带有参数的glBlendFuncSeparate

  1. 源因子 RGB
  2. 目标因子 RGB
  3. 源因子 Alpha
  4. 目标因子 Alpha

我找不到适合我的参数。

我还尝试将 glBlendEquation 与加法方程一起使用,但没有发现该方法有任何成功。

如何生成一个函数,成功地将两条线混合成紫色?

编辑:

我注意到glBlendFunc(GL_ONE, GL_DST_ALPHA) 确实执行了一些混合以产生中间颜色(实际的线条在这里只是无意义的,它只是为了显示一些混合)。

【问题讨论】:

  • 为什么不能用shader做呢?
  • 您似乎将红色与青色混合在一起。这通常不会变成紫色。
  • @JasonD 我明白,这就是我寻找比例因子混合方法的原因。我在和一个比我更有经验的人交谈,他说紫色混合物很适合欺骗眼睛。
  • @SAKrisT 也许我应该...我该怎么做?
  • 这对我来说似乎很奇怪,因为在立体图像中,重叠区域往往是灰色的。我建议您发布一张您正在尝试实现的混合的图片。

标签: opengl


【解决方案1】:

我正在渲染一条蓝线和一条红线(在立体图的上下文中)

不是您期望的答案,而是您需要的答案:在 OpenGL 中渲染浮雕图像的常用方法不是使用混合。混合很难做到正确,你不想用浮雕部分把事情弄得更糟。

常用的方法有两种:

  • 将每个视图渲染为 FBO 附加纹理,并在后处理步骤中将它们组合起来。

  • 使用glColorMask 为每个渲染步骤选择活动颜色通道。

我认为现在您对颜色蒙版方法很满意:按以下方式操作:

display:
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
    glViewport(…)

    # prepare left view
    setup_left_view_projection()
    glColorMask(1,0,0, 1); # red is commonly used for the left eye

    draw_scene()

    glClear(GL_DEPTH_BUFFER_BIT) # clear the depth buffer (and just the depth buffer!)

    # prepare right view
    setup_right_view_projection()
    glColorMask(0,1,1, 1); # cyan is commonly used for the right eye

    draw_scene()

【讨论】:

  • 是的,我实际上通过手动计算得到了立体图渲染,这对我来说很好。然而,我与一位有立体画经验的同行交谈,他说将两者混合成紫色会更有效地欺骗眼睛。
【解决方案2】:

典型的混合函数是glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);;请注意,最终颜色会根据绘制顺序而变化。

混合功能不那么明显,因此有时图形表示会更好;查看例如this 站点。

【讨论】:

  • 那个网站有this image,这似乎是我想要的混合方法,但是它根本没有混合。
  • 你给我的功能也没有产生混合。我认为出现的问题是当我希望它们混合时它们并不总是重叠。它们只是看起来重叠。 (因为它们在投影而不是物理上重叠)
  • 您突出显示的图像显示混合蓝色和红色以获得紫色。您不是在混合蓝色和红色,而是在混合青色和红色。
  • @louisdeb 你的线条颜色有 alpha 分量
  • @JasonD 抱歉,青色是正确的。我的措辞不够严格。
猜你喜欢
  • 2023-01-31
  • 2012-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-26
相关资源
最近更新 更多