=============================================光照=============================================
WARNING : 以下,强烈建议使用内置函数求值(因为宏),这里是为了更直观的看到运行时发生了什么
以下所有的顶点函数都是
v2f vert(a2v v)
{
v2f o;
// 除了这两个,其他用的都是原始参数
o.pos = UnityObjectToClipPos(v.vertex);
o.worldNormal = mul((float3x3)unity_ObjectToWorld,v.normal);
o.xxx = v.xxx;
return o;
}
Lambert (一般光照),(这里暂时只是计算片元亮度,没有环境光或是其他的散射光之类的,所以下面的段落会有一些偏差)
核心代码只有这一句,他的意思是通过在世界方向上的法线和世界光照的方向进行一个点乘(这个计算会返回他们之间角度的cos值,一般通过acos可以取得角度),通过计算得出的cos值进行一个颜色的叠加或是乘法计算 ( 这些计算都是外部,也也就是说不算是包含入光照模型 ) ,正对光的位置会更加的亮,而与光角度有偏移的则进行一个颜色上的衰减,但是由于这个角度可能会出现负数,所以进行一个0-1之间的限制,
// fixed3 worldNormal = mul((float3x3)unity_ObjectToWorld,v.normal);
// fixed3 lightDir = normalize(_WorldSpaceLightPos0.xyz);
fixed3 lambert =saturate(dot(worldNormal,lightDir));
半Lambert模型,通过 *0.5 + 0.5 把计算出来的数据进行一个0.5-1 之间的限制,让偏光的位置不会显得那么暗色
fixed3 lambert =dot(v.worldNormal,lightDir) * 0.5 + 0.5;
fixed4 frag(v2f v):COLOR
{
fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;
v.worldNormal = normalize(v.worldNormal);
fixed3 lightDir = normalize(_WorldSpaceLightPos0.xyz);
fixed3 lambert = saturate(dot(v.worldNormal,lightDir));
fixed3 color = lambert * _LightColor0.xyz + ambient;
return fixed4(color,1);
}
效果图如下
Phong(镜面高光) ,(这里暂时只是计算片元亮度,没有环境光或是其他的散射光之类的,所以下面的段落会有一些偏差)
核心代码只有这一句,这里用了一个CG的函数,这个函数接受两个float3向量,求出的是前一个向量作用在另一个向量上所形成的反射,可以理解为镜子,一束光照射在镜子上,此时,那一束光就是前一个向量,镜子平面法线就是后一个向量,我们通过计算这两个向量所形成的一个新的向量来与我们的视线方向做一个点积,获得到我们视野与反射角度所形成的一个角度,而通过这个角度,我们可以计算出我们目前是否可以看到一个高光,或者说是反射光
// v.normal = mul((float3x3)unity_ObjectToWorld,v.normal);
// float3 N = normalize(mul(v.normal,(float3x3)unity_WorldToObject));
// float3 L = normalize(_WorldSpaceLightPos0).xyz;
// float3 lightToNormal = UnityWorldSpaceLightDir(N);
float3 r = normalize(reflect(lightToNormal,N));
半角Phong , 不通过反射光进行计算,而是通过入射光与视角之间进行一个加法运算,这样我们可以得到一条新的向量,而通过这条新的向量来与我们的法线进行一个点积,就可以求出这个片元应该进行的反射强度
/// 有个向量求反了,不过没找到 = =
fixed4 frag(v2f v):COLOR
{
fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;
fixed3 mainTex = tex2D(_MainTex,v.uv);
fixed3 color = fixed3(1,1,1);
float3 N = normalize(mul(v.normal,(float3x3)unity_WorldToObject));
float3 V = normalize(_WorldSpaceCameraPos.xyz - mul(unity_ObjectToWorld,v.vertex)).xyz;
float3 L = normalize(_WorldSpaceLightPos0.xyz - mul(unity_ObjectToWorld,v.vertex)).xyz;
float3 H = normalize(L + V);
float specular = pow(saturate(dot(H,N)),_Specular);
color *= mainTex;
color += _LightColor0.rgb * specular;
return fixed4(color,1);
}
/// 半角Phong
fixed4 frag(v2f v):COLOR
{
fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;
fixed3 mainTex = tex2D(_MainTex,v.uv);
fixed3 color = fixed3(1,1,1);
float3 N = normalize(mul(v.normal,(float3x3)unity_WorldToObject));
float3 V = normalize(_WorldSpaceCameraPos.xyz - mul(unity_ObjectToWorld,v.vertex)).xyz;
float3 L = normalize(_WorldSpaceLightPos0.xyz - mul(unity_ObjectToWorld,v.vertex)).xyz;
float3 H = normalize(L + V);
float specular = pow(saturate(dot(H,N)),_Specular);
color *= mainTex;
color += _LightColor0.rgb * specular;
return fixed4(color,1);
}
=========================================预留,占坑==========================================
另一篇基础以后就丢参数好了,这一片丢某些实现,或是一些方法 Loading...