小试牛刀,尝试过滤某种颜色值的shader
2015年03月15日 18:03
0 点赞
1 评论
更新于 2025-11-21 17:14
以下是一个用于过滤特定颜色值的Shader代码,该Shader可以在Unity中使用。
Shader "liwei1dao/GetridofColor" {
// 属性部分,定义Shader可调节的参数
Properties {
_MainTex ("Base (RGB)", 2D) = "white" {}
_GetridofColor ("Ridof (RGB)", Color) = (1,1,1,1)
}
SubShader {
// 标签,指定渲染类型为不透明
Tags { "RenderType"="Opaque" }
// 混合模式,使用Alpha混合
Blend SrcAlpha OneMinusSrcAlpha
Pass {
CGPROGRAM
// 声明顶点着色器函数
#pragma vertex vrit_1dao
// 声明片段着色器函数
#pragma fragment fragment_1dao
// 包含Unity的常用CG函数库
#include "UnityCG.cginc"
// 纹理采样器,用于采样主纹理
sampler2D _MainTex;
// 这里_MainTex1未使用,可考虑移除
sampler2D _MainTex1;
// 要过滤的颜色值
float4 _GetridofColor;
// 顶点输入结构体
struct Inputvrite {
float4 vertex : POSITION; // 顶点位置
float4 texcoord : TEXCOORD0; // 纹理坐标
};
// 片段输入结构体
struct Inputfragment {
float4 pos : SV_POSITION; // 裁剪空间位置
float4 uv : TEXCOORD0; // 纹理坐标
};
// 计算当前颜色与要过滤颜色之间的距离,并进行插值
float ColorLerp(float3 tmp_nowcolor, float3 tmp_GetridofColor) {
// 计算颜色分量之间的差值
float3 dis = float3(
abs(tmp_nowcolor.x - tmp_GetridofColor.x),
abs(tmp_nowcolor.y - tmp_GetridofColor.y),
abs(tmp_nowcolor.z - tmp_GetridofColor.z)
);
// 计算颜色之间的欧几里得距离
float dis0 = sqrt(pow(dis.x, 2) + pow(dis.y, 2) + pow(dis.z, 2));
// 最大可能的颜色距离
float maxdis = sqrt(3);
// 对距离进行插值
float dis1 = lerp(0, maxdis, dis0);
return dis1;
}
// 顶点着色器函数
Inputfragment vrit_1dao(Inputvrite i) {
Inputfragment o;
// 计算裁剪空间位置
o.pos = mul(UNITY_MATRIX_MVP, i.vertex);
// 传递纹理坐标
o.uv = float4(i.texcoord.xy, 1, 1);
return o;
}
// 片段着色器函数
float4 fragment_1dao(Inputfragment o) : COLOR {
// 采样主纹理颜色
float4 c = tex2D(_MainTex, o.uv);
// 根据颜色距离调整透明度
c.a *= ColorLerp(c.rgb, _GetridofColor.rgb);
return c;
}
ENDCG
}
}
// 回退Shader,当当前Shader不可用时使用Diffuse Shader
FallBack "Diffuse"
}
代码解释
- Properties部分:定义了两个属性,
_MainTex是主纹理,_GetridofColor是要过滤的颜色。 - SubShader部分:
Tags指定渲染类型为不透明。Blend设置混合模式为Alpha混合。
- Pass部分:
CGPROGRAM和ENDCG之间是CG代码。ColorLerp函数计算当前颜色与要过滤颜色之间的距离,并进行插值。vrit_1dao是顶点着色器,计算裁剪空间位置和传递纹理坐标。fragment_1dao是片段着色器,采样纹理颜色,并根据颜色距离调整透明度。
注意事项
_MainTex1在代码中未使用,可以考虑移除。- 该Shader通过调整透明度来过滤颜色,实际效果可能需要根据具体需求进行调整。