医疗影像容积重建-光照模型

1. Phong 冯氏光照模型 ADS

计算机模拟真实场景的光照模型可以分为环境光(Ambient)、漫反射(Defuse)、镜面反射(高光)(Specular)。三种分量的效果如下

医疗影像容积重建-光照模型_第1张图片

首先,渲染某个点的颜色有以下几个主要因素,渲染点本身的颜色(c=Materrial Color),光源和渲染点的向量(I=Light Direction),渲染点的法向量(n=Surface Normal),观察点到渲染点的向量(v=View Direction)。

1. 在冯氏模型中,环境光的强度是一个常数,作用在物体的每一个点上都有相同的光强度效果,只和c有关。

2. 漫反射实际上和光源到渲染点的向量和当前点的法向量有关,和观察者视角方向无关。所以,和c、I、n有关;

3. 高光的计算就和光线到渲染点的法向量,渲染点的法向量,以及观察点到渲染点的向量都有关系,和c、I、n、v都有关系。

2. 光照模型中,各分量解释

2.1 环境光

物体表面所有的点,都发出等量强度的光,发散到周围的光的强度也就是大小是一致的。

示意图如下

医疗影像容积重建-光照模型_第2张图片

2.2 漫反射光

漫反射光的强度大小是和入射光和当前渲染点处的法向量夹角有关系,也就是入射光向量和法向量夹角的cos值成正比。漫反射的反射光,无论从哪个视角,去观察,都应该呈现出相同的强度颜色。

医疗影像容积重建-光照模型_第3张图片

漫反射计算公式如下

医疗影像容积重建-光照模型_第4张图片

2.3 高光

镜面光,是针对一些金属表面等光滑表面,对入射光进行发生。具有 这里介绍Blinn-Phong模型中的半程向量方法,

h(half),半程向量表示入射向量和观察向量的平分向量,镜面光的强度是当前法向量和半程向量的点乘。

I表示入射光的强度,r表示入射点到光源的距离。

Ks同样是当前点在当前光照下所呈现的颜色(也就是镜面分量对光的吸收)

dot (n,h),表示入射角和渲染点的法向量的夹角的cos值。

这里再解释一下p值,表示高光的衰减值,这个值越大,衰减速度越快。通过调整此参数,可以促进衰减速度,越大,使得高光,在半程向量与法线向量非常接近的情况下,才能被视角看见。

医疗影像容积重建-光照模型_第5张图片
3 VR医疗影像容积重建,每个点的渲染计算

在医疗VR的渲染中,光照是平行光,也就是每个渲染点上l向量的方向是不变的,观察向量和光线是平行的,和入射光向量是相同的。所有,在高光的计算过程中,半程向量h实际上就是入射光向量,也就是dot(n,h),实际上就是dot(n,l)的值。以下是CUDA的伪代码。

    float4 color; //  内部保存的是 rgb 和 透明度 w
    float3 n;
    float3 l;
    float r;
    float KsParams; (高光参数)
    float dR = r * r;
    float4 sum; 透视光线上到当前点的累计值
    n = normalize(n);
    l = normalize(l);
    float diffuse = dot(n, l);
    //环境光Ka = 0.24;
    float4 clrRender = color * Ka;
    float4 f4Temp = make_float4(0.0f);
    if ( diffuse > 0.0f )
    {
        //Kd = 0.8; Ks = 0.16
        f4Temp = col * (diffuse * Kd  + Ks * KsParams * (pow(diffuse, 64.0f))) / dR;
    }
    clrRender += f4Temp;
    // 以上计算过程是针对此点,按照Phong模型计算出来的
    // 以下alphaAcc是alpha通道的累计值,1-alphaAcc 表示当前渲染光线方向上,还剩余多少透明度
    float curColorAlpha = (1.0f - alphaAcc) * color.w; 
    return (sum + curColorAlpha * clrRender);

你可能感兴趣的:(C++,医疗设备业务随笔,算法,健康医疗,c++,vr)