遇到的问题:同样的代码,添加镜面反射光specular后,模型着色如下,不知道什么原因,而且最右边使用的自定义着色器的小球着色比系统的暗
1、添加specular镜面反射光
Shader "Custom/s_frag_diffuse_two" {
Properties{
_SpecularColor("Specular",color) = (1,1,1,1)
_Shininess("Shininess",range(1,32)) = 8
}
SubShader{
pass {
tags{ "LightMode" = "ForwardBase" }
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "unitycg.cginc"
#include "lighting.cginc"
float4 _SpecularColor;
float4 _Shininess;
struct v2f {
float4 pos:POSITION;
float3 normal:TEXCOORD1;
float4 vertex:COLOR;
};
v2f vert(appdata_base v) {
v2f o;
o.pos = mul(UNITY_MATRIX_MVP,v.vertex);
//原始的法向量
o.normal = v.normal;
//原始的光向量
o.vertex = v.vertex;
return o;
}
fixed4 frag(v2f IN) :COLOR{
//Ambient color
fixed4 col = UNITY_LIGHTMODEL_AMBIENT;
float3 N = UnityObjectToWorldNormal(IN.normal);
float3 L = normalize(WorldSpaceLightDir(IN.vertex));
//Diffuse Color
//dot(n,l)确定漫反射的强度问题
float diffuseScale = saturate(dot(N,L));
col += _LightColor0*diffuseScale;
//Specular Color
//光向量的反向量,即从顶点指向光源
float3 V = normalize(WorldSpaceViewDir(IN.vertex));
float3 R = 2 * dot(N, L)*N - L;
//系数
float specularScale = saturate(dot(R,V));
col += _SpecularColor*pow(specularScale, _Shininess);
return col;
}
ENDCG
}
}
}
着色后的效果:
2、
Shader "Custom/s_frag_diffuse_two" {
Properties{
_MainColor("MainColor",color)=(1,1,1,1)
_SpecularColor("Specular",color) = (1,1,1,1)
_Shininess("Shininess",range(1,32)) = 8
}
SubShader{
pass {
tags{ "LightMode" = "ForwardBase" }
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "unitycg.cginc"
#include "lighting.cginc"
float4 _SpecularColor;
float4 _Shininess;
float4 _MainColor;
struct v2f {
float4 pos:POSITION;
float3 normal:TEXCOORD1;
float4 vertex:COLOR;
};
v2f vert(appdata_base v) {
v2f o;
o.pos = mul(UNITY_MATRIX_MVP,v.vertex);
//原始的法向量
o.normal = v.normal;
//原始的光向量
o.vertex = v.vertex;
return o;
}
fixed4 frag(v2f IN) :COLOR{
//Ambient color
fixed4 col = UNITY_LIGHTMODEL_AMBIENT;
float3 N = UnityObjectToWorldNormal(IN.normal);
float3 L = normalize(WorldSpaceLightDir(IN.vertex));
//Diffuse Color
//dot(n,l)确定漫反射的强度问题
float diffuseScale = saturate(dot(N,L));
col += _LightColor0*_MainColor*diffuseScale;
//Specular Color,使用的是PHONE模型
//光向量的反向量,即从顶点指向光源
float3 V = normalize(WorldSpaceViewDir(IN.vertex));
float3 R = 2 * dot(N, L)*N - L;
//系数
float specularScale = saturate(dot(R,V));
col += _SpecularColor*pow(specularScale, _Shininess);
return col;
}
ENDCG
}
}
}
着色后的效果:
3、
添加点光源的影响
Shader "Custom/s_frag_diffuse_two" {
Properties{
_MainColor("MainColor",color)=(1,1,1,1)
_SpecularColor("Specular",color) = (1,1,1,1)
_Shininess("Shininess",range(1,32)) = 8
}
SubShader{
pass {
tags{ "LightMode" = "ForwardBase" }
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "unitycg.cginc"
#include "lighting.cginc"
float4 _SpecularColor;
float4 _Shininess;
float4 _MainColor;
struct v2f {
float4 pos:POSITION;
float3 normal:TEXCOORD1;
float4 vertex:COLOR;
};
v2f vert(appdata_base v) {
v2f o;
o.pos = mul(UNITY_MATRIX_MVP,v.vertex);
//原始的法向量
o.normal = v.normal;
//原始的光向量
o.vertex = v.vertex;
return o;
}
fixed4 frag(v2f IN) :COLOR{
//Ambient color
fixed4 col = UNITY_LIGHTMODEL_AMBIENT;
float3 N = UnityObjectToWorldNormal(IN.normal);
float3 L = normalize(WorldSpaceLightDir(IN.vertex));
//Diffuse Color
//dot(n,l)确定漫反射的强度问题
float diffuseScale = saturate(dot(N,L));
col += _LightColor0*_MainColor*diffuseScale;
//Specular Color,使用的是PHONE模型
//光向量的反向量,即从顶点指向光源
float3 V = normalize(WorldSpaceViewDir(IN.vertex));
float3 R = 2 * dot(N, L)*N - L;
//系数
float specularScale = saturate(dot(R,V));
col += _SpecularColor*pow(specularScale, _Shininess);
float3 wpos = mul(_Object2World,IN.vertex).xyz;
//点光源的支持
col.rgb += Shade4PointLights(
unity_4LightPosX0,unity_4LightPosY0,unity_4LightPosZ0,
unity_LightColor[0].rgb,unity_LightColor[1].rgb,unity_LightColor[2].rgb,unity_LightColor[3].rgb,
unity_4LightAtten0,
wpos,N);
return col;
}
ENDCG
}
}
}