把物体变灰代码分享

2015年03月21日 11:44 0 点赞 0 评论 更新于 2017-05-07 10:27

在图形编程中,有时我们需要将物体变为灰色,下面为大家分享一段实现该功能的Shader代码。

Shader "Shader_tex2D" {
// 定义Shader的属性
Properties {
// 主纹理,类型为2D,默认值为白色
_MainTex ("Base (RGB)", 2D) = "white" {}
}

SubShader {
// 设置渲染类型为不透明
Tags { "RenderType" = "Opaque" }
// 设定LOD(Level of Detail)值为200
LOD 200

// 开始CG代码块
CGPROGRAM
// 声明表面着色函数并设置光照模式为Lambert(漫反射)
#pragma surface surf Lambert

// 声明主纹理采样器
sampler2D _MainTex;

// 定义输入结构体
struct Input {
// 主纹理的UV坐标
float2 uv_MainTex;
};

// 表面着色函数
void surf (Input IN, inout SurfaceOutput o) {
// 从纹理中采样颜色
half4 c = tex2D(_MainTex, IN.uv_MainTex);
// 计算颜色的灰度值并将其赋值给颜色的各个通道
c = float4(Luminance(c));
// 设置反射光颜色
o.Albedo = c.rgb;
// 设置透明度
o.Alpha = c.a;
}
// 结束CG代码块
ENDCG
}

// 当当前Shader无法运行时,使用Diffuse Shader作为后备
Fallback "Diffuse"
}

代码解释

  1. Properties部分:定义了Shader的属性,这里只有一个主纹理 _MainTex,用于存储物体的纹理信息。
  2. SubShader部分
    • Tags:指定渲染类型为不透明,这意味着该物体不会进行透明处理。
    • LOD:设置细节层次,这里为200。
    • CGPROGRAMENDCG 之间是CG代码块,用于实现具体的着色逻辑。
    • #pragma surface surf Lambert:声明表面着色函数 surf,并使用Lambert光照模型。
    • sampler2D _MainTex:声明主纹理采样器。
    • struct Input:定义输入结构体,包含主纹理的UV坐标。
    • surf 函数:从纹理中采样颜色,计算其灰度值,并将灰度值赋值给反射光颜色,同时保留原有的透明度。
  3. Fallback部分:当当前Shader无法运行时,使用 Diffuse Shader作为后备,确保物体仍然可以正常渲染。

通过以上代码,我们可以将物体的纹理颜色转换为灰度颜色,实现物体变灰的效果。

作者信息

menghao

menghao

共发布了 332 篇文章