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