欢迎光临散文网 会员登陆 & 注册

URP | Normal法线贴图

2021-11-29 20:26 作者:那个人真狗  | 我要投稿

法线概念

法线是有 正反区别(-1,1)

  • DirectX12 里Y轴是N方向

不同平台使用的贴图正反是不一样的。

  • 不同平台使用的法线格式

HLSL调用法线贴图注意哪些

结构体

  • 在顶点结构体中,我们需要获取模型的顶点法线,顶点切线。

  • 输出到片元着色器结构体中

  • 这里说一下UV信息,为什么是float4类型,

    这里的uv.xy储存的是漫反射贴图的uv,uv.zw储存的法线的uv信息。

    这样的好处是合并到一起。

  • 法线,切线,副切正常类型是,

定义变量

  • 属性里定义一张法线贴图。以及控制法线的变量

  • 把一些变量放到C-buffer里。贴图采样也是。

顶点阶段

  • 顶点阶段,需要把顶点法线,顶点切线转换成世界空间下。


  • 第一部分 储存的颜色贴图,法线贴图的UV采样信息

  • 第二部分,把顶点法线,顶点切线转换成世界空间,输出。

    计算出副切线的数值。并在乘切线的w值判断正负,在乘负奇数缩放影响因子。

  • 这里注意,

    • v.tangentOS.w

      值为-1或者1,由DCC软件中的切线自动生成,和顶点的环绕顺序有关。

    • unity_WorldTransformParams.w

      定义于unityShaderVariables.cginc中.

      模型的Scale值是三维向量,即xyz,当这三个值中有奇数个值为负时(1个或者3个值全为负时),unity_WorldTransformParams.w = -1,否则为1.

  • 第三部分  计算出世界空间下的顶点坐标。储存到法线,切线,副切线的W通道中。

  • 注意:这里为什么需要把顶点位置穿片元着色器,我们是需要计算 视角向量(ViewDir)

    还有第二套写法,

扩展 在顶点着色器阶段,计算视角向量。

  • 片元结构体

    切线和法线,都是float3的类型了,

  • 在顶点阶段计算出viewDirWS 世界空间下的视角方向。

片元着色器

  • 在片元着色器阶段计算出TBN矩阵,这里需要把法线的信息和模型的法线信息混合起来,

    因为我们上面是使用模型顶点信息计算的高光,或者漫反射。 那单独看一下模型法线信息。


  • 这个结果就缺少细节,,看一下漫反射。


  • 现在法线信息 是有俩部分组成   ,法线贴图是增加细节的。

    新法线信息 =  模型顶点法线 + 法线贴图

  • 第一部分读取法线贴图

        读取贴图,    

  • 计算TBN   在读取贴图,增加一个控制贴图的强度的数值。

  • 贴图信息和TBN结合

  • 获取视角方向,光照方向 计算出半角向量

  • 使用新法线计算出漫反射

  • 增加上前面学习到的漫反射,高光发射


  • 效果

代码实现


URP | Normal法线贴图的评论 (共 条)

分享到微博请遵守国家法律