首页 > 代码库 > 写shader小细节——这个会不断更新

写shader小细节——这个会不断更新

这个是因为自己被自己蠢哭了动笔的,里面大概记录自己所犯的错,和一些小知识。

1.有一个错误我经常犯:内部定义的字段没对应开放到编辑器的字段。这个是由于我有点依赖ide写代码的习惯导致,而shader的ide只提供了基本的关键字高亮。

  纠正方法:对一个字段,一直使用拷贝粘贴的方式进行书写。

2.法线没归一化正确,导致效果奇奇怪怪,这个我是在写matcap那里犯的错:漏了这句:

o.twoUv.zw = o.twoUv.zw * 0.5 + 0.5;//(-1,1)->(0,1)

3.Tiling和Offset:

  Tiling:缩放模型UV纹理采样坐标,比如Tiling = 2,表示把模型UV坐标的U扩大2倍,U范围变成了0-2

    [此时模型U=[0,1]就采用了整个纹理,即模型的左半使用整个纹理;模型U = (1,2]的采样值使用纹理溢出填充值,看下面]

  Offset:偏移模型UV纹理采用坐标;比如Offset x=0.1表示把UV纹理坐标往左偏移,然后再采样,
  至于超出UV纹理的UV坐标采样的颜色值(纹理溢出填充值),则依赖UV纹理的WrapMode
  具体实现:
  float4 _MainTex_ST;//纹理缩放偏移向量(Unity默认此变量赋值,变量命名规则:纹理名_ST)
  vert()
  {
  ...
  //第一种方式:
  o.uv = v.vertex.xy * _MainTex_ST.xy + _MainTex_ST.zw;
  //第二种方式:使用内建宏,这只是对第一种的封装
  o.uv = TRANSFORM_TEX(v.vertex,_MainTex);
  }

 

写shader小细节——这个会不断更新