如何实现自己的混合功能?

时间:2014-06-25 08:01:17

标签: c++ c rendering blending glblendfunc

我想在我的程序中实现以下混合功能,而不使用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(..)

我尝试了一些东西,但我没有成功。 这个混合函数的等式有没有?

1 个答案:

答案 0 :(得分: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)

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