【问题标题】:how implement own blend function?如何实现自己的混合功能?
【发布时间】:2014-06-25 08:01:16
【问题描述】:

我想在不使用 OpenGL 的程序中实现以下混合功能。

glBlendFunc(GL_DST_COLOR, GL_ONE_MINUS_SRC_ALPHA);

在 OpenGL 实时测试应用程序中,我能够在白色背景上与此函数颜色混合。混合结果应类似于http://postimg.org/image/lwr9ossen/。 我有一个白色背景,想在上面混合红点。高密度的红点应该是不透明的/黑色的。

glClearColor(1.0f, 1.0f, 1.0f, 0.0f);

for(many many many times)
glColor4f(0.75, 0.0, 0.1, 0.85f);
DrawPoint(..)

我尝试了一些东西,但没有成功。 有人知道这个混合函数的方程式吗?

【问题讨论】:

    标签: c++ c rendering blending glblendfunc


    【解决方案1】:

    如果你想在自己的代码中实现整个事情,混合函数应该直接转换为你需要的操作。

    • 第一个参数指定源颜色的缩放因子,即绘制像素时使用的颜色。
    • 第二个参数指定目标颜色的缩放因子,即输出图像中像素位置的当前颜色值。
    • 然后将这两个项相加,并将结果写入输出图像。

    GL_DST_COLOR对应目标中的颜色,即输出图像。

    “GL_ONE_MINUS_SRC_ALPHA”是 1.0 减去您正在渲染的像素的 alpha 分量。

    将所有这些放在一起,(colR, colG, colB, colA) 是您正在渲染的像素的颜色,(imgR, imgG, imgB) 是输出图像中像素位置的当前颜色:

    GL_DST_COLOR = (imgR, imgG, imgB)
    GL_ONE_MINUS_SRC_ALPHA = (1.0 - colA, 1.0 - colA, 1.0 - colA)
    GL_DST_COLOR * (colR, colG, colB) + GL_ONE_MINUS_SRC_ALPHA * (imgR, imgG, imgB)
    = (imgR, imgG, imgB) * (colR, colG, colB) +
      (1.0 - colA, 1.0 - colA, 1.0 - colA) * (imgR, imgG, imgB)
    = (imgR * colR + (1.0 - colA) * imgR,
       imgG * colG + (1.0 - colA) * imgG,
       imgB * colB + (1.0 - colA) * imgB)
    

    这是渲染像素后写入图像的颜色。

    【讨论】:

      猜你喜欢
      • 2010-12-15
      • 1970-01-01
      • 1970-01-01
      • 2021-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多