• 4种基本光照模型


    1.Lambert模型(漫反射)

    环境光:

    Iambdiff = Kd*Ia

    其中Ia 表示环境光强度,Kd(0<K<1)为材质对环境光的反射系数,Iambdiff是漫反射体与环境光交互反射的光强。

    方向光:

    Ildiff = Kd * Il * Cos(θ)

    其中Il是点光源强度,θ是入射光方向与顶点法线的夹角,称入射角(0<=A<=90°),Ildiff是漫反射体与方向光交互反射的光强,若 N为顶点单位法向量,L表示从顶点指向光源的单位向量(注意顶点指向光源),则Cos(θ)等价于dot(N,L),故又有:

    Ildiff = Kd * Il * dot(N,L)

    最后综合环境光和方向光源,Lambert光照模型可以写成:

    Idiff = Iambdiff + Ildiff = Kd * Ia + Kd * Il * dot(N,L)

     

     

    2.Phong模型(镜面反射)

    Phong模型认为镜面反射的光强与反射光线和视线的夹角相关:

    Ispec = Ks * Il * ( dot(V,R) )^Ns

    其中Ks 为镜面反射系数,Ns是高光指数,V表示从顶点到视点的观察方向,R代表反射光方向。由于反射光的方向R可以通过入射光方向L(从顶点指向光源)和物体的法向量求出,
    R + L = 2 * dot(N, L) * N  即 R = 2 * dot(N,L) * N - L

    所以最终的计算式为:

    Ispec = Ks * Il * ( dot(V, (2 * dot(N,L) * N – L ) )^Ns

     

     

    3.Blinn-Phong光照模型(修正镜面光)

    Blinn-Phong是一个基于Phong模型修正的模型,其公式为:

    Ispec = Ks * Il * ( dot(N,H) )^Ns

    其中N是入射点的单位法向量,H是光入射方向L和视点方向V的中间向量,通常也称之为半角向量(半角向量被广泛用于各类光照模型,原因不但在于半角向量蕴含的信息价值,也在于半角向量是很简单的计算:H = (L + V) / |L + V|  )。

     

     

    4.Rendering Equation(全局光照模型)

    Rendering Equation 是Kajia在1986年提出的,

    Lo(X, Wo) = Le(X, Wo) + ∫fr(X, Wi, Wo) Li(X, Wi) dot(N, Wi) dWi

    其中X表示入射点,Lo(X, Wo)即从物体表面X点,沿方向Wo反射的光强,Le(X, Wo)表示从物体表面X以方向Wo 发射出去的光强,该值仅对自发光体有效,fr(X, Wi, Wo)为,入射光线方向为Wi, 照射到点X上,然后从Wo方向发射出去的BRDF值,Li(X, Wi)为入射方向为Wi照射到点X上的入射光强,N表示点X处的法向量,然后对入射方向进行积分(因为光线入射的方向是四面八方的,积分的意义是对每个方向进行一遍计算后相加),计算的结果就是全局光照的辐射率。

    对于单个点光源照射到不会自发光的物体上,公式可以简化成:

    Lo(X, Wo) = fr(X, Wi, Wo) Li(X, Wi) dot(N, Wi)

    这个公式非常有用,通常会将该公式分解为漫反射表达式和镜面表达式之和。对于漫反射表面,BRDF可以忽略不计,因为它总是返回某个恒定值,所以可以写成如下形式:

    Lo(X, Wo) = Idiff + frs(X, Wi, Wo) Li(X, Wi) dot(N, Wi)

    其中Idiff表示漫反射分量,使用公式的计算方法,frs(X, Wi, Wo)表示镜面反射的BRDF函数,前面的Phong高光模型,其实是rendering equation在单一光源下针对理想镜面反射的特定推导,对于Phong高光而言:

    frs(X, Wi, Wo) = Ks (dot(N, H)^Ns  / dot(N, Wi)

     

    //-------------------------------------------------------------------------------------------------------------------------

     

    几种光照模型的比较

    Lambert 模型能够较好地表现粗糙表面上的光照现象,如石灰墙,纸张等等,但是在渲染金属材质制成的物体时,则会显得呆板,表现不出光泽,主要原因是其没有考虑到镜面反射效果,所以Phong模型对其进行了很好的补充。由于Blinn-phng光照模型混合了Lambert的漫射部分和标准的高光,渲染效果有时会比 Phong高光更柔和,有些人认为phong光照模型比blinn-phong更加真实,实际上也是如此,Blinn-phong渲染效果要更加柔和一些,但是由于Blinn-phong的光照模型省去了计算反射光线方向向量的两个乘法运算,速度更快,因此成为许多CG软件中默认的光找渲染方法,此外它也继承在了大多数图形芯片中,用以产生实时的快速渲染。在OpenGL和Direct3D渲染管线中,Blinn-Phong就是默认的渲染模型。 Rendering Equation是基于物理光学的模型,其对于观察方向上的辐射率进行了本质上的量化,Phong模型只是其特定BRDF的推导。

    以下给出Blinn-Phong的CG片段,用于参考实现:

     1 struct VertexScreen
     2 {
     3     float4 oPosition : POSITION;
     4     float4 objectPos : TEXCOORD0;
     5     float4 objectNormal : TEXCOORD1;
     6 };
     7  
     8 void main_f(VertexScreen posIn,
     9     out float4 color : COLOR,
    10     uniform float4x4 worldMatrix,
    11     uniform float4x4 worldMatrix_IT,
    12     uniform float3 globalAmbient,
    13     uniform float3 eyePosition,
    14     uniform float3 lightPosition,
    15     uniform float3 lightColor,
    16     uniform float3 Kd,
    17     uniform float3 Ks,
    18     uniform float shininess)
    19 {
    20     float3 worldPos = mul(worldMatrix, posIn.objectPos).xyz;
    21     float3 N = mul(worldMatrix_IT, posIn.objectNormal).xyz;
    22     N = normalize(N);
    23  
    24     //计算入射光方向\视线方向\半角向量
    25     float3 L = normalize(lightPosition - worldPos);
    26     float3 V = normalize(eyePosition - worldPos);
    27     float3 H = normalize(L + V);
    28  
    29     // 计算漫反射分量
    30     float3 diffuseColor = Kd * globalAmbient+Kd*lightColor*max(dot(N, L), 0);
    31   
    32     //计算镜面反射分量
    33     float3 specularColor = Ks * lightColor*pow(max(dot(N, H), 0), shininess);
    34     color.xyz = diffuseColor + specularColor;
    35     color.w = 1;
    36 }
  • 相关阅读:
    STL中关于map和set的四个问题?
    PHP之Zip扩展,解压缩文件,ZipArchive类
    PHP之音乐ID3扩展
    关于PHP执行超时的问题
    PHP中GD库安装
    PHP之输出控制 ob_start(),ob_get_contents(),ob_end_clean()
    PHP之xdebug详解
    PHP上传文件详解
    php使用Header函数,PHP_AUTH_PW和PHP_AUTH_USER做用户验证及缺点
    深入研究php://input与php://output
  • 原文地址:https://www.cnblogs.com/ybqjymy/p/15698195.html
Copyright © 2020-2023  润新知