Shader "CustomDiffuse"
{
// 属性
Properties
{
// 主纹理 : 初始值白色
_MainTex ("_MainTex", 2D) = "white" {}
}
SubShader
{
// 标签
Tags
{
// 渲染类型 : 不透明物体
"RenderType" = "Opaque"
}
// 层次细节 200
LOD 200
// CG代码
CGPROGRAM
// 预处理指令
// surface surf : 指定这是一个surface类型的shader,其函数名为surf
// CustomDiffuse : 指定所使用的光照模型为自定义漫反射光照模型
#pragma surface surf CustomDiffuse
// CG属性 : 需和Properties的属性名保持一致
sampler2D _MainTex;
// 自定义光照函数
// lightDir参数 : 顶点到光源的方向(光照方向的反向)
// atten参数 : 光照衰减度
inline float4 LightingCustomDiffuse(SurfaceOutput s, fixed3 lightDir, fixed atten)
{
// 漫反射光照方向 = 顶点的法向量与光照方向的点积,为了避免为负(光从顶点内部射出),使用max函数
float4 difLight = max(0, dot(s.Normal, lightDir));
float4 col;
// 自定义漫反射光照颜色 = 顶点颜色 * 光照颜色 * 光照方向上的衰减度的两倍
// _LightColor0 : 是Unity Shader内部变量,表示全局光照颜色,可直接使用
col.rgb = s.Albedo * _LightColor0.rgb * (difLight * atten * 2);
col.a = s.Alpha;
return col;
}
// 输入结构体
struct Input
{
// 主纹理的uv
float2 uv_MainTex;
};
// 着色函数
void surf(Input IN, inout SurfaceOutput s)
{
// tex2D纹理采样函数 : 采样主纹理的颜色
half4 c = tex2D(_MainTex, IN.uv_MainTex);
// 将采样到的颜色值进行像素输出
s.Albedo = c.rgb;
s.Alpha = c.a;
}
ENDCG
}
}
漫反射着色 - 创建自定义漫反射光照模型
最新推荐文章于 2021-03-30 18:30:46 发布