zoukankan      html  css  js  c++  java
  • blinn-phong高光反向穿透问题

    blinn-phong高光:     

    H=normalize(V+L);
                

    specular=pow(saturate(dot(N,H)),shiness);

    会遇到如下问题:

    图中光源在surface背面,但却仍然产生高光。(可以验证,不使用半角向量h,而使用反射向量r的原始phong高光也存在类似问题。)

    此问题的一种简单解决办法,是判断出光源在surface背面则令specular为0,即:

    H=normalize(V+L);
                

    specular=pow(saturate(dot(N,H)),shiness);

    if(dot(N,L)<0){

      specular=0;

    }

    这样确实能避面背光面产生高光,但是在背光面和受光面之间高光突然截断会产生过硬的明暗交界线。

    也见过有算法是用specular直接乘以一下diffuse,从而获得柔和过度,但往往会过于柔和。

    为了使交界线处过度柔和且柔和程度可控,可以采用如下技巧:

    首先不难看出上面代码等价于:

    H=normalize(V+L);
                

    specular=pow(saturate(dot(N,H)),shiness);

    specular*=step(0,dot(N,L));

    为使过度平滑,只需用smoothstep代替step,即:

    H=normalize(V+L);
                

    specular=pow(saturate(dot(N,H)),shiness);

    specular*=smoothstep(0,0.12,dot(N,L));

    这样就ok了。

    注:smoothstep(0,0.12,dot(N,L))的含义就是:当dot(N,L)<0时,取0;当dot(N,L)>0.12时取1,当dot(N,L)介于0与0.12之间时平滑插值。

  • 相关阅读:
    Hive学习笔记三
    spark之RDD练习
    Python之QRCode
    Zookeeper学习笔记一
    Docker学习笔记一
    MapReduce异常:java.lang.ClassCastException: interface javax.xml.soap.Text
    Hive学习笔记二
    Hive学习笔记一
    5.线性回归算法
    4.K均值算法
  • 原文地址:https://www.cnblogs.com/wantnon/p/7158181.html
Copyright © 2011-2022 走看看