三维模型上的标量场指的是三维模型上面的每个顶点都有一个标量值,从而构成了整体的标量场。如果能够以颜色代表这个标量值的大小,那么整体的标量场就能够方便的观察出来。一般来说,hls颜色模型的色相能够代表从红到蓝的渐进过度,因此可以用hsl转rgb的方法生成一维纹理。然后归一化标量场,将标量值作为一维的纹理坐标,从而显示出整个标量场。如何加载任意格式图片作为纹理,以及其它关于OpenGL纹理的内容,可以参考我其它文章。
但是这样比较麻烦。首先,需要颜色空间转换,还有使用的是一维纹理。其实,有更方便的做法。直接找一张代表从红到蓝的渐进过度纹理图片,加载这张图片生成纹理,使用二维纹理坐标,固定一维的坐标,如s,变化t。
对应的二维纹理图和实现效果:
这里需要注意一个问题,就是极限纹理坐标的跳变。比如说,纹理坐标很小接近0,可能就会直接跳到1去了,插值出来的颜色就会从红直接变成蓝,或者从蓝直接变成红,明显是不对的。如图所示,
处理这个问题的方法,有两种,一种是修改纹理坐标的模型为GL_MIRRORED_REPEAT的而不是一般的GL_REPEAT,第二个是将纹理坐标的范围压缩到大于0小于1之间。求的最大和最小标量值后,往外扩展下,再进行标量值的归一化。可以用下面的代码,处理。
float fDis = fMax - fMin;
fMin = fMin - fDis 0.001;
fMax = fMax + fDis 0.001;
这样正确的显示如下,
现在可以看到,本来是带蓝色中心的红带,变成了全部是红色的带了。