0

我想在不使用 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(..)

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

4

1 回答 1

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)

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

于 2014-06-26T08:37:23.233 回答