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

  • 相关阅读:
    gaia 开源多语言的pipeline 平台
    vernemq 集群 docker-compose 搭建简单试用
    nginx http2 push 试用
    几个方便进行micro frontend 开发的工具&&类库
    Compoxure example 应用说明
    Compoxure 微服务组合proxy 中间件
    SCS Characteristics
    How_Require_Extensions_Work
    nodejs-hook 开发
    microcks 微服务mocks 工具&&运行时
  • 原文地址:https://www.cnblogs.com/wantnon/p/7158181.html
Copyright © 2011-2022 走看看