UGUI序列帧
Posted 那个妹子留步
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UGUI序列帧相关的知识,希望对你有一定的参考价值。
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
Shader "Yly/YlyUISeqFrameAni"
// if( (referenceValue & maskValue) comparisonFunction (stencilBufferValue & maskValue) )
// 通过测试,保留像素
//
// else
// 丢弃像素
//
//按位与&
//Stencil Comparison 总共九种
//0 DIsable 模板测试 或者 深度测试不可用时
//1 Never 模板测试 或者 深度测试 永远不通过时
//2 Less 模板测试 或者 深度测试 小于 则通过
//3 Equal 模板测试 或者 深度测试 等于 则通过
//4 LessEqual 模板测试 或者 深度测试 小于等于 则通过
//5 Greater 模板测试 或者 深度测试 大于 则通过
//6 NotEqual 模板测试 或者 深度测试 不等于 则通过
//7 GreaterEqual 模板测试 或者 深度测试 大于等于
//8 Always 模板测试 或者 深度测试 永远通过
//
//Stencil Operation 总共八种
//Keep 保持当前的stencilBufferValue
//Zero 将值设为0
//Replace referenceValue 代替stencilBufferValue
//incrementSature 将值+1 ,若值为 255 则不变 (不溢出)
//decrementSature 将值-1 ,若是为0 则不变 (不溢出)
//invert 按位取反,即若为0 ,则变为255
//incrementWrap 将值+1 若值为 255 则变为 0 (溢出)
//decrementWrap 将值-1 若值为 0 则变为 255 (溢出)
//WriteMask 写入的时候将该值 与 referenceValue 和 stencil BufferValue 分别进行按位与操作
//ReadMask 读取的时候 将该值maskValue 与 referenceValue 和stencilBufferValue 分别进行 按位与 操作
//Fail 当 模板测试 和 深度测试 都失败时 进行的处理操作
//ZFail 当模板测试通过时 深度测试失败时 进行的处理操作
//ColorMask
//ColorMask RGB|A|0|其他RGBA的组合
//ColorMask R 意思是输出 颜色值中只有R 通道会被写入
//ColorMask 0,意思是不会输出任何颜色
//默认值为RGBA 即四个通道都写入
//0-1 A 2-3 B 4-5 G 6-7 BG 8-9 A
//10-11RB 12-13RG 14-15 RBG
Properties
_RowCount("RowCount",float) = 0
_ColCount("ColCount",float) = 0
_Speed("Speed",float) = 30
_MainTex("Texture",2D) = "White"
//用在UI上的shader 一般都需要 加下面的模板测试逻辑 避免呗mask组件的父节点 遮罩时 没有遮罩效果
_Stencil("Stencil ID",float) = 0 //referenceValue
_StencilComp("Stencil Comparison",float) = 8 //CompareFunc
_StencilOp("Stencil Operation",float) = 0 //操作方法
_StencilWriteMask("Stencil Write Mask",float) = 255
_StencilReadMask("Stencil Read Mask",float) = 255
_ColorMask("Color Mask",float) = 15 //11111111 255
SubShader
Tags
"Queue" = "Transparent" //一般UI 都是这种渲染队列 从远到近 渲染
"IgnoreProjector" = "true" //忽略投影 一般的UIshader 为提高效率 都会设置为true
"RenderType" = "Transparent"
"PreviewType" = "Plane" //材质球 预览模式 设为 画片
"CanUseSpriteAtlas" = "True" //设置——MainTex 可以使用 Sprite (2D and UI)类型的贴图
Stencil
Ref[_Stencil]
Comp[_StencilComp]
ReadMask[_StencilReadMask]
WriteMask[_StencilWriteMask]
Pass[_StencilOp]
//Fail[_StencilOp]
//ZFail[_StencilOp]
Cull Off //面的剔除模式 Cull Off 不剔除 Cull Back 剔除背面(背向摄像机的面) Cull Front 剔除前面(朝向摄像机的面)
Lighting Off
//下面两句设置ZTest 只根据 UI节点 的树层次 作为依据进行测试 不根据Z值
ZWrite Off //深度写入开关 即在进行完深度测试后 是否 将 深度写入 深度缓存区中 (如果是透明物体 一定要关掉 不然 会出现错误 挡住后面像素输出)
ZTest[unity_GUIZtestMode] //UI材质的深度测试
Blend SrcAlpha OneMinusSrcAlpha
//最终颜色值 = 输出颜色值 * 输出颜色值Alpha值 + 背景颜色值 * (1-a) 挡在前面类似隔着玻璃的效果
ColorMask[_ColorMask]
Pass
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
#include "UnityUI.cginc"
struct appdata
float4 vertex:POSITION;
float4 color:COLOR;
float2 uv:TEXCOORD0;
;
struct v2f
float4 vertex:SV_POSITION;
float2 uv:TEXCOORD0;
fixed4 color:COLOR;
;
sampler2D _MainTex;
float4 _MainTex_ST;
float _Speed;
float _RowCount;
float _ColCount;
v2f vert(appdata v)
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = TRANSFORM_TEX(v.uv,_MainTex);
return o;
fixed4 frag(v2f i):SV_Target
float totalCount = _ColCount * _RowCount;
float curIndex = floor((_Time.y*_Speed)%totalCount);
float offsetU = floor(curIndex%_ColCount);//UV起点 U偏移 0,1,2,3,4
float offsetV = floor(_RowCount - floor(curIndex/_ColCount) - 1); // 0 ,1,2
float2 unitSize = float2(1/_ColCount,1/_RowCount);
float2 originUv = float2(offsetU,offsetV) * unitSize;
float2 newUv = i.uv * unitSize + originUv;
fixed4 col = tex2D(_MainTex,newUv);
return col;
ENDCG
以上是关于UGUI序列帧的主要内容,如果未能解决你的问题,请参考以下文章