小试牛刀,尝试过滤某种颜色值的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"
}

代码解释

  1. Properties部分:定义了两个属性,_MainTex 是主纹理,_GetridofColor 是要过滤的颜色。
  2. SubShader部分
    • Tags 指定渲染类型为不透明。
    • Blend 设置混合模式为Alpha混合。
  3. Pass部分
    • CGPROGRAMENDCG 之间是CG代码。
    • ColorLerp 函数计算当前颜色与要过滤颜色之间的距离,并进行插值。
    • vrit_1dao 是顶点着色器,计算裁剪空间位置和传递纹理坐标。
    • fragment_1dao 是片段着色器,采样纹理颜色,并根据颜色距离调整透明度。

注意事项

  • _MainTex1 在代码中未使用,可以考虑移除。
  • 该Shader通过调整透明度来过滤颜色,实际效果可能需要根据具体需求进行调整。

作者信息

boke

boke

共发布了 3994 篇文章