共计 1865 个字符,预计需要花费 5 分钟才能阅读完成。
Unity Shader 入门精要笔记
纹理动画
纹理动画即管制纹理随着工夫的变动而变动。
序列帧动画
首先须要一张蕴含了所有动画帧的主纹理,它有两点要求,它的每行和每列都应该是能够等分的,它是从左到右,从上到下顺次排列的。
序列帧动画的关键在于,计算该时刻下应该播放的关键帧的地位,并对该关键帧进行纹理采样。
步骤如下:
- 除了申明序列帧图像的纹理_MainTex 外,还须要申明序列帧图像纹理上每一行和每一列有多少个关键帧图像。
- 序列帧图像通常都是通明纹理,蕴含了通明通道,所以须要设置 Pass 的状态,将其当做一个半透明对象,在 SubShader 中将 Tags 设置为:Tags {“RenderType”=”Transparent” “Queue”=”Transparent” “IgnoreProjector”=”True”},并且在 Pass 中敞开深度写入,应用 Blend 命令开启混合模式。
-
在片元着色器中计算关键帧的地位,并对其采样。
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 坐标偏移量随工夫变动,并且每张纹理图的单位偏移量不同。
比方,咱们要应用两张纹理图来模仿滚动背景。
关键步骤如下:
- 申明两张纹理图属性和滚动速度属性。
-
在顶点着色器中对 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);
-
在片元着色器中,利用前景图像纹理的通明通道来混合两张纹理:
fixed4 firstLayer = tex2D(_MainTex,i.uv.xy); fixed4 secondLayer = tex2D(_DetailTex,i.uv.zw); fixed4 c = lerp(firstLayer,secondLayer,secondLayer.a);
顶点动画
顶点动画,即利用工夫变量在顶点着色器中对顶点坐标进行偏移。因而须要在 SubShader 中设置 DisableBatching = True.
顶点动画须要留神以下几点:
- 须要在 SubShader 中设置 DisableBatching = True。防止 Unity Shader 的批处理(批处理会合并相干模型,导致模型空间失落),然而这样会升高性能,因而要防止应用模型空间下的相对地位和方向进行计算。
- 对顶点动画的物体增加暗影成果,无奈应用 Unity 自带的暗影 Pass,因为内置的暗影 Pass 没有进行相干的顶点动画。须要本人编写 ShadowCaster Pass。