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之间时平滑插值。

  • 相关阅读:
    function与感叹号
    js中的|| 与 &&
    [转] html屏蔽右键、禁止复制
    ExtJS 5.1 WINDOW BLUR
    ExtJS 网页版执行工具
    Excel 随即获得一组数据集中的数据
    [转] Spring Data JPA Tutorial: Pagination
    Set up eclipse for Ext js and spket IDE plugin
    ExtJS Alias, xtype and widget
    ExtJS stores
  • 原文地址:https://www.cnblogs.com/wantnon/p/7158181.html
Copyright © 2011-2022 走看看