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

  • 相关阅读:
    201571030134 由《构建之法》所想到的~
    unity3d 打包Xcode工程自动添加framework
    Unity3d Vuforia与Mobile Movie Texture插件结合
    Unity3d 打开本地摄像头扫描二维码
    Unity3d 获取文件夹的图片
    iOS开发 Button自定义
    Unity3D判断鼠标左右滑动
    unity3d控制物体旋转的角度
    第一次作业
    人工智能第二次作业
  • 原文地址:https://www.cnblogs.com/wantnon/p/7158181.html
Copyright © 2011-2022 走看看