C++ 将浮点值转换为RGB值

C++ 将浮点值转换为RGB值,c++,opengl,rgb,data-conversion,C++,Opengl,Rgb,Data Conversion,我有一个700万浮点正值的数据集,从10^(-7)到10^(0)。我想以“线性方式”将浮点值转换为RGB值。到目前为止,我一直使用[255 const*| log(float value)|]/255,它是有效的,但我想知道是否有一种方法可以在不使用对数的情况下转换值,或者(我希望如此)是否有一个OpenGL库可以在GPU之前完成这项工作 编辑1: 从10^(-7)到10^(1)的值。我想以最快的方式获得转换,因为我需要一个快速的程序(这就是为什么我想使用GPU) 编辑2: 难道没有一个Open

我有一个700万浮点正值的数据集,从10^(-7)到10^(0)。我想以“线性方式”将浮点值转换为RGB值。到目前为止,我一直使用[255 const*| log(float value)|]/255,它是有效的,但我想知道是否有一种方法可以在不使用对数的情况下转换值,或者(我希望如此)是否有一个OpenGL库可以在GPU之前完成这项工作

编辑1: 从10^(-7)到10^(1)的值。我想以最快的方式获得转换,因为我需要一个快速的程序(这就是为什么我想使用GPU)

编辑2: 难道没有一个OpenGL函数可以通过给定最大值和最小值来缩放您的值吗? 我有一个带有用户界面的程序,我想在程序运行时更改“值窗口”。 我想要这样的

EDIT3:这能帮我吗?

EDIT4:我想在Matlab中获得类似Jet颜色贴图的东西

我想这取决于你实际拥有这些值的地方。如果您在OpenGL中生成它们,那么您可以在OpenGL中执行转换,这会很快,然后提取数据。如果您在CPU内存中,那么在GPU内存中来回移动数据也需要一些时间


对于这种循环,如果使用optimization-O3编译,编译器通常会对代码进行矢量化优化(请参阅)。这应该适用于GCC、MSVC和其他编译器。检查编译器的特定矢量化功能。

由于无符号字符介于0和255之间,您可以执行以下操作:

int max = max_value_from_range;
int max = min_value_from_range;
if ( max == min ) return; // avoid to divide by 0
unsigned char out [RANGE_LEN]
for( int i = 0; i < RANGE_LEN; i++ )
    out[i] = 255 * ( FLOAT_INPUT[i] - min ) / ( max - min );
int max=范围内的最大值;
int max=范围内的最小值;
如果(最大==最小)返回;//避免被0除
未签名字符输出[范围]
对于(int i=0;i
您的值在[0.0,1.0]区间内。把它们乘以255并四舍五入到整数就足够了吗?对不起,我编辑了我的文章。你说的“线性方式”是什么意思?当前公式中有日志,是否要使用其他公式获得相同的输出?您的值现在在0到10之间?因此,按10的比例缩小,得到介于0和1之间的值,然后乘以255(正如Miguel Muñoz所说)。除非应用了色域,否则不需要对任何日志/表达式操作执行任何操作。10^(1)==10,10^(-7)==0.0000001~=0。RANGE_LEN与dim不同吗?对不起,我的错。我修好了。它们是一样的。非常感谢!所以你建议使用glcolor3f内部的[i],对吗?是的,如果你想对数据有更多的控制,你可以这样做。尽管如此,如果您希望实现的是大量基于opengl的,那么您应该了解如何将此方法集成到itglColor3f中,它采用0-1.0范围内的浮点值。不是0-255范围内的字符。out[]是无符号字符吗?