unity unity改变kinect深度颜色_(四).UIEffect_颜色替换_UIColorReplace_Shader

本文介绍如何在Unity中编写Shader,实现UIEffect的UIColorReplace功能。通过创建Cginc文件、Shader,设置Properties,处理模板测试和深度测试,以及编写Pass代码,实现颜色替换的效果。详细讲解了Shader的各个步骤,包括参数图片的传入、参数获取、颜色处理等。
摘要由CSDN通过智能技术生成

6a308857d336fc5a6c5671d3c94a3c42.png

又是蛋疼的Shader... 终于出太阳了 赞美太阳!!!


项目都是Copy(chao xi)大佬的Git,感谢mob-sakai大佬的项目.

mob-sakai/UIEffect​github.com
df72b2cc754d60c455297aaa8bfedca6.png

同时也感谢单手撸管 线的群主->maxwell.

下面是我的这个项目的Git地址.

HHHHHHHHHHHHHHHHHHHHHCS/MyShaderHelloWorld​github.com
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(&#
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值