Shader "Sbin/MyDiffuseFrag"
{
SubShader
{
pass
{
//渲染路径的类型
tags("LightMode"="Vertex")
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
//引用公用方法 Unity\Editor\Data\CGIncludes\sbin
#include "unitycg.cginc"
#include "Lighting.cginc"
struct v2f
{
float4 pos: POSITION;
//float3 normal:NORMAL;错误的不能用NORMAL,从顶点到片段程序不支持
float3 normal:TEXCOORD1;
float3 lightDir:COLOR;
};
//基于顶点,模型当中有一个顶点,就会启动一个顶点程序,有N个顶点启动N个顶点程序
//顶点程序计算完v2f传递给片段程序
//一个三角形有很多个像素点,但是我们用了一个发向量和一个光照向量
v2f vert(appdata_base v)
{
v2f o;
o.pos=mul(UNITY_MATRIX_MVP,v.Vertex);
//发向量转化到世界空间
o.normal= v.normal;
//光照向量转化到世界空间
O.lightDir=v.vertex;
return o;
}
//片段程序进行光栅化处理,将三角形面片生成适配于屏幕像素点的片段,
//一个片段程序对应一个像素点的处理
//对原始的法线,原始的顶点数据的计算要在片段程序中进行
//法线旋转到世界空间,计算光向量都要在片段程序中
fixed4 frag(v2f IN):COLOR
{
//环境光源
fixed4 col=UNITY_LIGHTMODEL_AMBIENT;
//发向量
float3 N=UnityObjectWorldNormal(IN.normal);
//光照向量
float3 L=normalize(WorldSpaceLightDir(IN.Vertex));
//漫反射强度
float diffuseScale=saturate(dot(N,L));
col+=_LightColor0*diffuseScale;
return col;
}
ENDCG
}
}
}
Shader "Sbin/MySpecularFrag"
{
Properties
{
_MainColor("MainColor",color)=(1,1,1,1)
_SpecularLightColor("SpecularColor",color)=(1,1,1,1)
//光照系数
_Shininess=("Shininess",range(1,32))=8
}
SubShader
{
pass
{
//渲染路径的类型
tags("LightMode"="Vertex")
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
//引用公用方法 Unity\Editor\Data\CGIncludes\sbin
#include "unitycg.cginc"
#include "Lighting.cginc"
#include "UnityShaderVariables.cginc"
float4 _MainColor;
float4 _SpecularLightColor;
float _Shininess;
struct v2f
{
float4 pos: POSITION;
//float3 normal:NORMAL;错误的不能用NORMAL,从顶点到片段程序不支持
float3 normal:TEXCOORD1;
float3 lightDir:COLOR;
};
//基于顶点,模型当中有一个顶点,就会启动一个顶点程序,有N个顶点启动N个顶点程序
//顶点程序计算完v2f传递给片段程序
//一个三角形有很多个像素点,但是我们用了一个发向量和一个光照向量
v2f vert(appdata_base v)
{
v2f o;
o.pos=mul(UNITY_MATRIX_MVP,v.Vertex);
//发向量转化到世界空间
o.normal= v.normal;
//光照向量转化到世界空间
O.lightDir=v.vertex;
return o;
}
//片段程序进行光栅化处理,将三角形面片生成适配于屏幕像素点的片段,
//一个片段程序对应一个像素点的处理
//对原始的法线,原始的顶点数据的计算要在片段程序中进行
//法线旋转到世界空间,计算光向量都要在片段程序中
fixed4 frag(v2f IN):COLOR
{
//环境光源
fixed4 col=UNITY_LIGHTMODEL_AMBIENT;
//发向量
float3 N=UnityObjectWorldNormal(IN.normal);
//光照向量
float3 L=normalize(WorldSpaceLightDir(IN.Vertex));
//漫反射强度
float diffuseScale=saturate(dot(N,L));
col+=_LightColor0*_MainColor*diffuseScale;
//Specular color
//视向量
float3 V=normalize(WorldSpaceLightDir(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
}
}
}