Unity Shader 入门精要笔记

纹理动画

纹理动画即管制纹理随着工夫的变动而变动。

序列帧动画

首先须要一张蕴含了所有动画帧的主纹理,它有两点要求,它的每行和每列都应该是能够等分的,它是从左到右,从上到下顺次排列的。

序列帧动画的关键在于,计算该时刻下应该播放的关键帧的地位,并对该关键帧进行纹理采样。

步骤如下:

  1. 除了申明序列帧图像的纹理_MainTex外,还须要申明序列帧图像纹理上每一行和每一列有多少个关键帧图像。
  2. 序列帧图像通常都是通明纹理,蕴含了通明通道,所以须要设置Pass的状态,将其当做一个半透明对象,在SubShader中将Tags设置为:Tags { "RenderType"="Transparent" "Queue"="Transparent" "IgnoreProjector"="True" },并且在Pass中敞开深度写入,应用Blend命令开启混合模式。
  3. 在片元着色器中计算关键帧的地位,并对其采样。

                  float time = floor(_Time.y * _Speed);         float row = floor(time/_HorizontalAmount);         float column = time - row * _VerticalAmount;         // half2 uv=float2(i.uv.x/_HorizontalAmount,i.uv.y/_VerticalAmount);         // uv.x+=column/_HorizontalAmount;         // uv.y-=row/_VerticalAmount;         half2 uv = i.uv + half2(column,-row);         uv.x /= _HorizontalAmount;         uv.y /= _VerticalAmount;

    前三行计算了关键帧的地位,即对序列帧中第几个关键帧采样。_Time内置变量存储了该场景加载以来通过了多少工夫,其y重量上即是具体的工夫。用工夫time除以程度方向上关键帧的个数,并对后果向下取证,能够失去对应的行索引,而后用除法后果的余数作为列索引。这样咱们就晓得了须要对第几个关键帧进行采样。而后咱们要计算以后纹理坐标映射到子图像(须要采样的关键帧)中的纹理坐标是多少,这能够用以后的纹理坐标除以行数和列数来取得。最初,咱们须要计算最初理论要采样的纹理坐标是多少,这就是关键帧的左上角的坐标来加上坐标偏移量。那么关键帧左上角的坐标是多少?咱们晓得uv坐标的范畴是(0,1),并且在纹理属性中将其设置为了Repeat(值超过1的坐标会舍弃整数局部,取小数进行计算)。因而用行索引和列索引来除以行列上的关键帧个数,即失去了关键帧左上角的坐标。如下图:

滚动动画

很多2D游戏应用了一直滚动的背景来模仿角色在场景中的穿梭,用多个层(layers)来模仿视差成果。

滚动动画的关键在于,应用多张纹理图,对这些纹理图进行采样的时候,uv坐标偏移量随工夫变动,并且每张纹理图的单位偏移量不同。
比方,咱们要应用两张纹理图来模仿滚动背景。

关键步骤如下:

  1. 申明两张纹理图属性和滚动速度属性。
  2. 在顶点着色器中对uv坐标进行变换:

     o.uv.xy = TRANSFORM_TEX(v.texcoord, _MainTex) + frac(float2(_ScrollX,0.0) * _Time.y); o.uv.zw = TRANSFORM_TEX(v.texcoord, _DetailTex) + frac(float2(_Scroll2X,0.0) * _Time.y); 
  3. 在片元着色器中,利用前景图像纹理的通明通道来混合两张纹理:

     fixed4 firstLayer = tex2D(_MainTex,i.uv.xy); fixed4 secondLayer = tex2D(_DetailTex,i.uv.zw); fixed4 c = lerp(firstLayer,secondLayer,secondLayer.a); 

顶点动画

顶点动画,即利用工夫变量在顶点着色器中对顶点坐标进行偏移。因而须要在SubShader中设置DisableBatching = True.

顶点动画须要留神以下几点:

  1. 须要在SubShader中设置DisableBatching = True。防止Unity Shader的批处理(批处理会合并相干模型,导致模型空间失落),然而这样会升高性能,因而要防止应用模型空间下的相对地位和方向进行计算。
  2. 对顶点动画的物体增加暗影成果,无奈应用Unity自带的暗影Pass,因为内置的暗影Pass没有进行相干的顶点动画。须要本人编写ShadowCaster Pass。