C#Opengl将单个值转换为RGB< 0,1>

时间:2015-01-07 21:42:00

标签: c# opengl colors

我需要在C#中将单个值转换为RGB以为单个点着色。这些值存储在列表中,一个值存储到一个点。

1)我知道列表中的最小值和最大值。

2)值的范围可以是任意值,例如:-13,20000,0.000234 ...

3)红色,绿色和蓝色值必须在范围< 0; 1>范围内。我使用glColor3f。

如何融合?

1 个答案:

答案 0 :(得分:1)

没有规范的方法将单个1维值映射到3-dimensional space of colors。您基本上正在寻找一种从1维间隔生成3d曲线的自动方法。显然,有很多方法可以做到这一点。

评论者建议使用固定颜色的色度(如红色)并改变其亮度。虽然这可能是最简单的方法,但您显然不希望这样做。

另一种方法是将您的值映射到HSV Color Space,将实际值映射到hue并为饱和度和值选择一些固定值(从最大值开始并将其调低如果结果太亮了。)

因此算法可能如下:

  1. 获取最大和最小。

  2. 将min映射到色调的最小角度,比如10度,并将最大值映射到最大角度,比如说350度。 (您需要使用这些边界)。

  3. 对于列表中的每个值,

  4. 插值最大和最小色调之间的值:

    var hue = minHue + (maxHue - minHue) * (value - min)/(max - min)
    
  5. 给定饱和度和值的固定值(比如每个开始为1.0),使用此答案中的代码将它们映射到RGB颜色空间:Is there a built-in C#/.NET System API for HSV to RGB?

  6. 以上返回R,G和B的范围为0-255。根据您的要求将它们标准化为0到1之间。

  7. 如果您熟悉Paint.NET,它的颜色选择器工具允许您为S和V的给定值选择色调(H):

    enter image description here

    你做的基本上与从工具中挑选颜色一样。