您的位置:首页 > 其它

漫反射着色 - 创建半兰伯特光照模型

2017-11-28 16:51 537 查看
Shader "HalfLambert"
{
// 属性
Properties
{
// 主纹理 : 初始值白色
_MainTex("_MainTex", 2D) = "white" {}
}

SubShader
{
// 标签
Tags
{
// 渲染类型 : 不透明物体
"RenderType" = "Opaque"
}

// 层次细节 : 200
LOD 200

// CG代码
CGPROGRAM

// 预处理指令
// surface surf : 指定此为suface类型的shader, 渲染函数为surf
// HalfLambert : 指定所使用的光照模型为自定义半兰伯特光照模型
#pragma surface surf HalfLambert

// 自定义半兰伯特光照模型
// lightDir参数 : 顶点到光源的方向向量
// atten参数 : 光照强度衰减值
inline float4 LightingHalfLambert(SurfaceOutput s, fixed3 lightDir, fixed atten)
{
// 漫反射光照方向 = 顶点的法线向量与光照方向的点积
float4 difLight = dot(s.Normal, lightDir);

// 半兰伯特光照方程
float4 hLambert = difLight * 0.5 + 0.5;

float4 col;

// _LightColor0 : 是UnityShader的内部变量,代表全局光照颜色,可直接使用
col.rgb = s.Albedo * _LightColor0.rgb * (hLambert * atten * 2);
col.a = s.Alpha;

return col;
}

// CG变量 : 与Properties中的变量名保持一致
sampler2D _MainTex;

// 输入结构体
struct Input
{
// 在在纹理名称前直接加上uv,代表取纹理的uv
float2 uv_MainTex;
};

// 着色函数
void surf(Input IN, inout SurfaceOutput s)
{
// 纹理采样,样本为_MainTex
half4 c = tex2D(_MainTex, IN.uv_MainTex);

// 将颜色进行像素输出
s.Albedo = c.rgb;
s.Alpha = c.a;
}

ENDCG
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐