遇到的问题:当法向量使用UnityObjectToWorldNormal()方法后,一直报如下的错
1、向量L:从顶点指向光源并经过正规化后的向量,向量R是反射向量,中间N是顶点的法向量
2、x的值为r乘以a角的余弦值
3、由于r的值是1,所以x就是a的余弦值
4、使用公式R=2*Dot(N,L)*N-L
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
Shader "Custom/MySpecular" {
Properties{
_SpecularColor("Specular",color) = (1,1,1,1)
_Shininess("Shininess",range(1,64)) = 8
}
SubShader{
pass {
tags{ "LightMode" = "ForwardBase" }
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "unitycg.cginc"
#include "lighting.cginc"
float4 _SpecularColor;
float _Shininess;
struct v2f {
float4 pos:POSITION;
fixed4 color : COLOR;
};
v2f vert(appdata_base v) {
v2f o;
o.pos = mul(UNITY_MATRIX_MVP,v.vertex);
float3 L = normalize(WorldSpaceLightDir(v.vertex)); //光向量
float3 N = UnityObjectToWorldNormal(v.normal) //法向量
//使用公式R=2*Dot(N,L)*N-L
float ndotl = saturate(dot(N, L));
o.color = _LightColor0*ndotl;
float3 R = 2 * dot(N, L)*N - L;
float3 V = WorldSpaceViewDir(v.vertex);
R = normalize(R);
V = normalize(V);
//模拟当物体特别亮,当稍微一转就没有那么亮的物理现象
float specularScale = pow(saturate(dot(R, V)), _Shininess);
o.color.rgb += _SpecularColor*specularScale;
return o;
}
fixed4 frag(v2f IN) :COLOR{
//环境光照
return IN.color + UNITY_LIGHTMODEL_AMBIENT;
}
ENDCG
}
}
}
5、blingpong
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
Shader "Custom/MySpecular" {
Properties{
_SpecularColor("Specular",color) = (1,1,1,1)
_Shininess("Shininess",range(1,64)) = 8
}
SubShader{
pass {
tags{ "LightMode" = "ForwardBase" }
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "unitycg.cginc"
#include "lighting.cginc"
float4 _SpecularColor;
float _Shininess;
struct v2f {
float4 pos:POSITION;
fixed4 color : COLOR;
};
v2f vert(appdata_base v) {
v2f o;
o.pos = mul(UNITY_MATRIX_MVP,v.vertex);
float3 L = normalize(WorldSpaceLightDir(v.vertex)); //光向量
float3 N = UnityObjectToWorldNormal(v.normal) //法向量
//使用公式R=2*Dot(N,L)*N-L
float ndotl = saturate(dot(N, L));
//Ambient Color环境光
o.color = UNITY_LIGHTMODEL_AMBIENT;
//Diffuse Color:漫反射光
o.color += _LightColor0*ndotl;
float3 R = 2 * dot(N, L)*N - L;
float3 V = normalize(WorldSpaceViewDir(v.vertex));
float3 H = L + V;
H = normalize(H);
//H和N计算点积
float specularScale = pow(saturate(dot(H, N)), _Shininess);
o.color.rgb += _SpecularColor*specularScale;
return o;
}
fixed4 frag(v2f IN) :COLOR{
//环境光照
return IN.color;
}
ENDCG
}
}
}