unity|specular终结
unity技术Thepoly 14409 0
实名

通过了实名认证的内容创造者

发布于 2022-3-24 19:49:26

您需要 登录 才可以下载或查看,没有账号?注册

x
本帖最后由 Thepoly 于 2022-3-24 19:50 编辑

             src=http___xqimg.imedao.com_17b70f518351426d3fd73b36.png!800.jpgrefer=http___xqimg.imedao.webp.jpg
174551k9r66ex7z719e99h.jpg
Hello . all
今天,我们来完成unity渲染phong的最后一步
specular的制作
我是木偶心没

上一次的分享有说到,specular的算法主要有三步:首先得到平面上点的法向量N;然后根据光源的方向求得反射光R;最后根据R求得反射光与人眼的夹角θ,θ越小说明人眼与反射光越接近,等到θ等于0的时候,就可以最大化的看到反射光。
所以现在我们开始在shadergraph里面来完成我们的算法。
打开上次diffuse的那个shader,我们直接在这个shader的基础上叠加specular效果,就可以最终得到phong shader的效果。
首先新建节点NormalVector来获取物体表面的法向量(记得space一定要和之前的diffuse一样选world)
然后光源方向,直接用上次输入的light direction变量,将这两个参数输入到一个叫做reflection的节点里面,就可以得到我们光源的反射光线辣
得到反射光线以后,还需要获取人观察的方向,然后反射光线和观察方向进行点乘,就可以求得θ值了。
人观察的方向可以直接用shader graph自带的view direction来获取,所以结果如下;
因为黑色颜色值为0,但是如果是负数的话,得到的颜色也是0,所以为保证颜色值在0-1之间,我们给结果加上一个Maximum节点,去除掉小于0的值。
如此便得到specular的效果,最后将其与之前做的diffuse相加,输入到最后的输出节点中。
观察最后的输出,可以看到高光的地方特别亮,以至于挡掉了diffuse的颜色值。
所以我们需要想办法让这个高光值不那么大,0-1之间的值怎么才能够越变越小,就是乘以自己,所以我们给高光加上一个power函数,来控制高光范围。
保存后在场景中观察得到的结果。
此时的小球已经有了我们梦寐以求的高光效果!
为方便外部可调性,将power的幂值暴露出去,新添加一个类型为float的input,命名为shininess,并将默认值改为10。值越大表示高光范围越小。
同样,我们再给高光的输出乘上一个参数来控制specular高光的亮度。
这样我们就可以在外部随意调节高光的亮度和范围了。

- End -

本帖被以下画板推荐:

还没有设置签名!您可以在此展示你的链接,或者个人主页!
使用道具 <
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表