去饱和OpenGL纹理

时间:2012-07-18 22:27:21

标签: c# opengl colors grayscale opentk

我有一个带有透明度的.png,我需要去饱和。我读过我需要取位图的平均R,G和B值然后使用:

G*.59
R*.3
B*.11

我用这种方式计算平均颜色:

private Color Average_Color(Bitmap bitmap) {
  Color c = new Color();
  int pixel_number = 0;
  int r = 0;
  int g = 0;
  int b = 0;

  for (int i = 0; i < bitmap.Width; i++) {
    for (int j = 0; j < bitmap.Height; j++) {
      c = bitmap.GetPixel(i, j);
        r += c.R;
        g += c.G;
        b += c.B;
        pixel_number++;
    }
  }
  c = Color.FromArgb(1, r / pixel_number, g / pixel_number, b / pixel_number);
  return c;
}

然后,首先绘制我的纹理,我以这种方式设置颜色:

rgb = Average(bitmap);
GL.Color3(rgb.R * 0.59, rgb.G * 0.3, rgb.B * 0.11);
//here I draw my texture

我不知道为什么但它不起作用(我用原始颜色获得纹理)。我想Average_Color中有问题。也许是因为它不是一个完全不透明的位图?

2 个答案:

答案 0 :(得分:1)

OpenGL期望它的颜色浮点数从0到1标准化,但我怀疑你的位图报告的颜色是0-255。

因此我假设你将RGB值大大超过1传递给glColor,它被限制为1,因此你的纹理看起来是一样的。

尝试

GL.Color3(rgb.R*0.59/255.f, rgb.G*0.3/255.f, rgb.B*0.11/255.f);

答案 1 :(得分:0)

尝试在鸿沟之前将变量转换为浮点数