No.1
学习对象为大神冯乐乐的CSDN
本节主要学习了
属性 Properties
三种自定义光照模型函数
漫反射光照模型
半兰伯特光照模型
渐变图实现双向反射分布优化的光照模型
tex2D函数 dot函数等
代码记录如下
```csharp
Shader "Unlit/BasicDiffuse"
{
Properties
{
_MainTex("texture",2D)="white"{}
_RampTex("_RampTex",2D)="white"{}
_EmissiveColor("EmissiveColor",COLOR)=(1,1,1,1)
_AmbientColor("AmbientColor",COLOR)=(1,1,1,1)
_MySliderValue("This is a Slider",Range(0,10))=2.5
}
SubShader {
Tags { "RenderType"="Opaque" }
LOD 200
CGPROGRAM
//#pragma surface surf Lambert
#pragma surface surf BasicDiffuse_BRDF
sampler2D _MainTex;
sampler2D _RampTex;
//每再属性 Properties中声明一个变量时,需要再CGPROGAM中声明一个和Properties中名称相同的变量,这将建立一个链接,两者将操作同一个数据
//
float4 _EmissiveColor;
float4 _AmbientColor;
float _MySliderValue;
//自定义光照模型
//名称命名为 Lighting<自定义的光照模型的名称>
//有三种可供选择的光照模型函数
//half4 LightingName(SurfaceOutput s,half3 lightDir,half atten){} -这个函数被用于forward rendering(正向渲染),但是不需要考虑view direction(观察角度)时。
//half4 LightingName(SurfaceOutput s,half3 lightDir,half3 viewDir, half atten){} -这个函数被用于forward rendering(正向渲染),需要考虑view direction(观察角度)时。
//half4 LightingName_PrePass (SurfaceOutput s, half4 light){} -这个函数被用于需要使用defferred rendering(延迟渲染)时。
inline float4 LightingBasicDiffuse(SurfaceOutput s,fixed3 lightDir,fixed atten)
{
//计算到达该点的光照值 dot返回的结果相当于到达该点入射光的余弦值 角度越大,值越小,进入人眼光照越少,物体看起来越暗
//max函数放置,光照从相反方向射入时,会出现非预期的效果,比如全黑,所以使用max 函数确保光照值不是非预期效果
float difLight=max(0,dot(s.Normal,lightDir));
//半兰伯特光照模型 使光照值从0-1.0 变为0.5-1.0 是物体更亮
float hLambert=difLight*0.5+0.5;
//使用渐变图控制控制漫反射光照的颜色
float2 tempRamp=(hLambert,hLambert);
float3 ramp=tex2D(_RampTex, tempRamp).rgb;
float4 col;
//计算颜色值COL
//颜色值的rgb由三部分计算得到:
// 一。s的反射率 反射率越大,进入人眼光线越多,颜色越鲜亮
// 二。LightColor0.rgb _LightColor0是unity内置变量,我们可以使用它得到场景中光源的颜色
// 三。最后一个是得到得到的该点的光照值和衰减率的乘积 后面的乘2根据效果自行修改,乘2时光照会更鲜艳
col.rgb=s.Albedo *_LightColor0.rgb * (ramp) /*(hLambert *atten *2)*/;
col.a=s.Alpha;
return col;
}
//自动逸光照模型
//这个自定义光照将使用双向反射分布函数
//即考虑观察值的正向渲染
//新增加参数viewDir 这个参数将由unity 内部提供,来得到当前的观察点位置到观察点的方向向量
inline float4 LightingBasicDiffuse_BRDF(SurfaceOutput s,fixed3 lightDir,half3 viewDir,fixed atten)
{
//计算到达该点的光照值 dot返回的结果相当于到达该点入射光的余弦值 角度越大,值越小,进入人眼光照越少,物体看起来越暗
//max函数放置,光照从相反方向射入时,会出现非预期的效果,比如全黑,所以使用max 函数确保光照值不是非预期效果
//float difLight=max(0,dot(s.Normal,lightDir));
//将上面求光照点的两个夹角后面的光照改为veiweDir
float difLight=max(0,dot(s.Normal,viewDir));
//半兰伯特光照模型 使光照值从0-1.0 变为0.5-1.0 是物体更亮
float hLambert=difLight*0.5+0.5;
//使用渐变图控制控制漫反射光照的颜色
float2 tempRamp=(hLambert,hLambert);
float3 ramp=tex2D(_RampTex, tempRamp).rgb;
float4 col;
//计算颜色值COL
//颜色值的rgb由三部分计算得到:
// 一。s的反射率 反射率越大,进入人眼光线越多,颜色越鲜亮
// 二。LightColor0.rgb _LightColor0是unity内置变量,我们可以使用它得到场景中光源的颜色
// 三。最后一个是得到得到的该点的光照值和衰减率的乘积 后面的乘2根据效果自行修改,乘2时光照会更鲜艳
col.rgb=s.Albedo *_LightColor0.rgb * (ramp) /*(hLambert *atten *2)*/;
col.a=s.Alpha;
return col;
}
struct Input {
float2 uv_MainTex;
};
void surf (Input IN, inout SurfaceOutput o) {
half4 c = tex2D (_MainTex, IN.uv_MainTex);
//float4 c;
//c=pow((_EmissiveColor+_AmbientColor),_MySliderValue);
o.Albedo = c.rgb;
o.Alpha = c.a;
}
ENDCG
}
FallBack "Diffuse"
}