逐顶点漫反射:顶点之间片段颜色采用插值计算填充
Shader "Custom/Shader04"
{
Properties
{
_Diffuse("DiffuseColor", Color) = (1,1,1,1)
}
SubShader
{
Pass
{
Tags {"Lighting" = "ForwardBase"} //定义LightMode,获取UNITY内部光照变量
CGPROGRAM
fixed4 _Diffuse;
#include "Lighting.cginc"//引入UNITY内置文件,获取光照变量 _LightColor0:第一个直射光的颜色,_WorldSpaceLightPos0.xyz
// Physically based Standard lighting model, and enable shadows on all light types
//#pragma surface surf Standard fullforwardshadows
#pragma vertex vert//声明顶点着色器
#pragma fragment frag//声明片段着色器
// Use shader model 3.0 target, to get nicer looking lighting
//#pragma target 3.0
struct a2v {//从应用程序传递到顶点函数的语义POSITION:顶点坐标,NURMAL:法线(模型空间下),TEXCOORD0-n:纹理坐标,COLOR:顶点颜色
float4 vertex:POSITION;//获取顶点坐标
float3 normal:NORMAL;
};
struct v2f {//从顶点函数传递到片原函数的语义SV_POSITION:(剪裁空间中的顶点坐标-系统直接使用),COLOR0/COLOR1:可以传递一组值(4个),TEXCOORD0~7:传递纹理坐标
//f2s片原函数传递给系统:SV_Target:颜色值-输出到屏幕上的颜色(缓存颜色)
float4 position:SV_POSITION;
fixed3 color : COLOR1;
};
v2f vert(a2v v)//顶点之间片段颜色采用插值计算填充
{
v2f f;
f.position = UnityObjectToClipPos(v.vertex);//将坐标从模型空间转换到剪裁空间
//f.temp = v.normal;
fixed3 amblent = UNITY_LIGHTMODEL_AMBIENT.rgb;//获取系统环境光
//fixed3 norDir = normalize(unity_WorldToObject(v.normal));//法线方向从世界空间转到模型空间(弃用的方法)
fixed3 N = UnityObjectToWorldNormal(v.normal);//法线方向从世界空间转到模型空间
fixed3 lightDir = normalize(_WorldSpaceLightPos0.xyz);//第一个直射光的位置,对于顶点来说光的位置即是光的方向
fixed3 diffuse = _LightColor0.rgb*max(dot(N,lightDir),0)* _Diffuse.rgb;//根据漫反射公式:直射光颜色 * cos夹角(光与法线)获取颜色 dot(a,b):点乘获取两向量的夹角
f.color = diffuse+amblent;//+:颜色得加(亮度增强),*:融合
return f;
}
fixed4 frag(v2f f) :SV_Target//片原函数,片段在屏幕上像素颜色,返回颜色值
{
return fixed4(f.color,1);//返回法线
}
ENDCG
}
}
FallBack "Diffuse"
}
——————————————————————————————————
逐像素漫反射:逐个像素计算漫反射计算量大
Shader "Custom/PixivsRander"
{
Properties
{
_Diffuse("DiffuseColor", Color) = (1,1,1,1)
}
SubShader
{
Pass
{
Tags {"Lighting" = "ForwardBase"} //定义LightMode,获取UNITY内部光照变量
CGPROGRAM
fixed4 _Diffuse;
#include "Lighting.cginc"//引入UNITY内置文件,获取光照变量 _LightColor0:第一个直射光的颜色,_WorldSpaceLightPos0.xyz
// Physically based Standard lighting model, and enable shadows on all light types
//#pragma surface surf Standard fullforwardshadows
#pragma vertex vert//声明顶点着色器
#pragma fragment frag//声明片段着色器
// Use shader model 3.0 target, to get nicer looking lighting
//#pragma target 3.0
struct a2v {//从应用程序传递到顶点函数的语义POSITION:顶点坐标,NURMAL:法线(模型空间下),TEXCOORD0-n:纹理坐标,COLOR:顶点颜色
float4 vertex:POSITION;//获取顶点坐标
float3 normal:NORMAL;
};
struct v2f {//从顶点函数传递到片原函数的语义SV_POSITION:(剪裁空间中的顶点坐标-系统直接使用),COLOR0/COLOR1:可以传递一组值(4个),TEXCOORD0~7:传递纹理坐标
//f2s片原函数传递给系统:SV_Target:颜色值-输出到屏幕上的颜色(缓存颜色)
float4 position:SV_POSITION;
fixed3 wordNormalDir : COLOR1;//向片原函数传递法线
};
v2f vert(a2v v)
{
v2f f;
f.position = UnityObjectToClipPos(v.vertex);//将坐标从模型空间转换到剪裁空间
f.wordNormalDir = UnityObjectToWorldNormal(v.normal);
return f;
}
fixed4 frag(v2f f) :SV_Target//片原函数,片段在屏幕上像素颜色,返回颜色值
{
fixed3 amblent = UNITY_LIGHTMODEL_AMBIENT.rgb;//获取系统环境光
fixed3 lightDir = normalize(_WorldSpaceLightPos0.xyz);//第一个直射光的位置,对于顶点来说光的位置即是光的方向
//fixed3 diffuse = _LightColor0.rgb * max(dot(f.wordNormalDir,lightDir),0) * _Diffuse.rgb;//根据漫反射公式:直射光颜色 * cos夹角(光与法线)获取颜色 dot(a,b):点乘获取两向量的夹角
fixed3 harfLambert =dot(f.wordNormalDir, lightDir)*0.5+0.5;//半兰伯特光照模型:直射光颜色 * (cos夹角(光与法线)*0.5+0.5):使背光面不完全为黑色
fixed3 diffuse = _LightColor0.rgb * harfLambert * _Diffuse.rgb;
fixed3 tempColor = diffuse + amblent;//+:颜色得加(亮度增强),*:融合
return fixed4(tempColor,1);//返回法线
}
ENDCG
}
}
FallBack "Diffuse"
}
Shader-顶点漫反射(*自身)(+环境光)-逐像素反射
2020-08-17