加入收藏 | 设为首页 | 会员中心 | 我要投稿 二游网_173173游戏网 (http://www.173173youxi.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 新闻中心 > 游戏评测 > 正文

实时渲染:给你两张法线图,你会怎么混合它们?

发布时间:2022-07-27 13:16:34 所属栏目:游戏评测 来源:互联网
导读:在游戏开发过程中我们常常会遇到需要混合法线的情况,如:长有青苔的山石;衣服布料的 detailnormal ;破损的墙面、锈渍的金属等。如何正确的混合它们并且保留原法线的细节是本文探讨的问题。 这时候可能会有人问,为什么要实时去混合它们呢?我提前把法线做

   在游戏开发过程中我们常常会遇到需要混合法线的情况,如:长有青苔的山石;衣服布料的detailnormal;破损的墙面、锈渍的金属等。如何正确的混合它们并且保留原法线的细节是本文探讨的问题。

 

  这时候可能会有人问,为什么要实时去混合它们呢?我提前把法线做好材质本来应该有的样子或是在SDPS里混合好不就行了。而且还省了贴图张数,减少了采样的次数,减少混合的计算。但恰恰相反,实时的去混合法线恰恰是为了节省性能和更好的效果,例如我们在表现布料的时候如果我们想要表现非常细节的毛线穿插感。

 

  如果我们只用一张法线去表现,那可能需要一张4K甚至8K的法线贴图才能把表现出高精度的细节。但是这些微小的细节往往都是四方连续的,所以目前主流游戏的做法是用一张基础法线+非常小尺寸的detailnormal用比较高的tilling值进行混合。

 

  更别提大世界不同地形地貌之间的混合来获得自然的过渡和法线效果了。好,我们言归正传,重点介绍一下法线混合的方法,上图上代码

 

  Linear Blending

 

  float3 n1 = tex2D(texBase, uv).xyz * 2 - 1;

 

  float3 n2 = tex2D(texDetail, uv).xyz * 2 - 1;

 

  float3 r  = normalize(n1 + n2);

 

  线性混合是非常简单粗暴的方法,可能也是我们大多数时候所使用的的方法,直接相加采样出的法线,进行线性的插值。这种方法输出的结果会往两种输入的normal进行平均,导致的结果就是,变平,细节变模糊。

 

  这是因为法线图存储的并不是颜色,而是当前像素的法线信息,用处理颜色的方式一样去处理法线必然会造成数据被平均。

 

  Overlay Blending

 

  float3 n1 = tex2D(texBase, uv).xyz;

 

  float3 n2 = tex2D(texDetail, uv).xyz;

 

  float3 r  = n1 < 0.5 ? 2 * n1 * n2 : 1 – 2 * (1 - n1) * (1 - n2);

 

  r = normalize(r * 2 - 1);

 

  overlay虽然整体有改进,但是输出的结果还是不太正确的,它和linear blending的方式一样都是对通道独立处理,这种方法基本相当于放到PS里混合。

 

  Partial Derivative Blending

 

  float3 n1 = tex2D(texBase, uv).xyz*2 - 1;

 

  float3 n2 = tex2D(texDetail, uv).xyz*2 - 1;

 

  float2 pd = n1.xy/n1.z + n2.xy/n2.z;  //Add the PDs

 

  float3 r  = normalize(float3(pd, 1));

 

  通过计算偏导数混合的方式可以看出已经到了很多,至少我们的椎体明显感觉立起来了,可以推敲的点是椎体表面的detailnormal看起来还是太柔和了,但在处理淡入和淡出的时候不失为一种好方法。

(编辑:二游网_173173游戏网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读