![6a308857d336fc5a6c5671d3c94a3c42.png](https://img-blog.csdnimg.cn/img_convert/6a308857d336fc5a6c5671d3c94a3c42.png)
又是蛋疼的Shader... 终于出太阳了 赞美太阳!!!
项目都是Copy(chao xi)大佬的Git,感谢mob-sakai大佬的项目.
mob-sakai/UIEffectgithub.com![df72b2cc754d60c455297aaa8bfedca6.png](https://img-blog.csdnimg.cn/img_convert/df72b2cc754d60c455297aaa8bfedca6.png)
同时也感谢单手撸管 线的群主->maxwell.
下面是我的这个项目的Git地址.
HHHHHHHHHHHHHHHHHHHHHCS/MyShaderHelloWorldgithub.com![6c6c729f34e670291f1670cc0f5c6c93.png](https://img-blog.csdnimg.cn/img_convert/6c6c729f34e670291f1670cc0f5c6c93.png)
开始进入正文
开始写蛋疼的Shader 了,
1.创建一个Cginc UIEffectBase.cginc,这个里面放通用的方法,会在很多的shader里面都会用 . 我们压缩数据 , 这里我们就要在shader里面先写解压数据的方法了 . #ifndef UIEffectBase #define UIEffectBase 是防止重复导入用的 . 然后添加 解压数据的方法 . 把在C#里面压缩方法倒过来想就OK了.
#ifndef UIEffectBase
#define UIEffectBase
//把float解析成 half4 xyzw 被压缩成0~1
//float 按照 ((((w)*64+z)*64+y)*64+x) 储存
//63为最大精度(6位)
half4 UnpackToVec4(float value)
{
const uint PACKER_STEP = 64;
const uint PRECISION = PACKER_STEP - 1;
half4 unpacked;
unpacked.x = (value % PACKER_STEP) / PRECISION;
value = floor(value / PACKER_STEP);
unpacked.y = (value % PACKER_STEP) / PRECISION;
value = floor(value / PACKER_STEP);
unpacked.x = (value % PACKER_STEP) / PRECISION;
value = floor(value / PACKER_STEP);
unpacked.w = (value % PACKER_STEP) / PRECISION;
return unpacked;
}
//把float解析成 half3 xyz 被压缩成0~1
//float 按照 (((z)*256+y)*256+x) 储存
//255为最大精度(8位)
half3 UnpackToVec3(float value)
{
const int PACKER_STEP = 256;
const int PRECISION = PACKER_STEP - 1;
half3 unpacked;
unpacked.x = (value % (PACKER_STEP)) / (PACKER_STEP - 1);
value = floor(value / (PACKER_STEP));
unpacked.y = (value % PACKER_STEP) / (PACKER_STEP - 1);
value = floor(value / PACKER_STEP);
unpacked.z = (value % PACKER_STEP) / (PACKER_STEP - 1);
return unpacked;
}
//把float解析成 half2 xy 被压缩成0~1
//float 按照 ((y)*4096+x) 储存
//4096为最大精度(12位)
half2 UnpackToVec2(float value)
{
const int PACKER_STEP = 4096;
const int PRECISION = PACKER_STEP - 1;
half2 unpacked;
unpacked.x = (value % (PACKER_STEP)) / (PACKER_STEP - 1);
value = floor(value / (PACKER_STEP));
unpacked.y = (value % PACKER_STEP) / (PACKER_STEP - 1);
return unpacked;
}
#endif
2.创建一个空Shader S_UIColorReplace.shader , 命名名字 UI/S_UIColorReplace 要跟C#里面的ShaderName的变量一样 .
//颜色替换
Shader "UI/S_UIColorReplace"
{
Properties
{
}
SubShader
{
}
}
3.先写UI的模板基础
- 先添加Properties .
_MainTex是UI的贴图 Unity自动传入的 . [PerRendererData] 用于批处理 , 提高性能 .
Stencil之类的是模板测试用的 , 我们不用手动修改 Unity会自动修改参数 , UI可以用模板测试进行不显示 , 比如Mask .
_UseUIAlphaClip 是 是否用clip来进行不显示 . [Toggle(UNITY_UI_ALPHACLIP)] , 如果Toggle是true , 则自动#define UNITY_UI_ALPHACLIP , 可以用#ifdef 进行预处理 .
//颜色替换
Shader "UI/S_UIColorReplace"
{
Properties
{
[PerRendererData] _MainTex("Main Texture",2D)="white"{}
_StencilComp("Stencil Comparison",Float)=8
_Stencil("Stencil ID",Float)=0
_StencilOp(&#