【Unity Shader入门精要学习】Unity中的基础光照(
2019-08-24 本文已影响0人
小王子称号发放NPC
漫反射
lambert
![](https://img.haomeiwen.com/i12199894/0fff4156b82d9871.png)
1、逐顶点
Shader "Unlit/Lambert"
{
Properties
{
_Diffuse("Diffuse",Color) = (1.0,1.0,1.0,1.0)
}
SubShader
{
Pass
{
Tags {"LightModel" = "ForwardBase"}
CGPROGRAM
#include "Lighting.cginc"
#pragma vertex vert
#pragma fragment frag
fixed4 _Diffuse;
struct a2v
{
float4 vertex:POSITION;
float3 normal:NORMAL;
};
struct v2f
{
float4 pos:SV_POSITION;
fixed3 color:COLOR;
};
v2f vert(a2v v)
{
v2f o;
//mul(UNITY_MATRIX_MVP,v.vertex);
o.pos = UnityObjectToClipPos(v.vertex);
//获取环境光
fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;
//首先把顶点法线转换到世界坐标系下,在世界坐标系下进行计算
//转换法线的矩阵是原矩阵的逆转置矩阵
//将矩阵放在mul的第二个参数相当于对这个矩阵做了一次转置运算
float3 worldNormal = normalize(mul(v.normal,(float3x3)unity_WorldToObject));
//获取世界坐标系下的光源方向
//这里只假设场景中只有一个光源且是平行光
float3 lightDirection = normalize(_WorldSpaceLightPos0.xyz);
//在同一坐标系下做点乘运算
fixed3 diffuse = _LightColor0.rgb * _Diffuse.rgb * max(0,dot(worldNormal,lightDirection));
o.color = ambient + diffuse;
return o;
}
fixed4 frag(v2f f):SV_TARGET
{
return fixed4(f.color,1.0);
}
ENDCG
}
}
}
2、逐像素
Shader "Unlit/Lambert-Pixel"
{
Properties
{
_Diffuse("Diffuse",Color) = (1.0,1.0,1.0,1.0)
}
SubShader
{
pass
{
Tags{ "LightModel" = "ForwardBase" }
CGPROGRAM
#include "Lighting.cginc"
#pragma vertex vert
#pragma fragment frag
fixed4 _Diffuse;
struct a2v
{
float4 pos:POSITION;
float3 normal:NORMAL;
};
struct v2f
{
float4 pos:SV_POSITION;
float3 worldNormal:TEXCOORD0;
};
v2f vert(a2v a)
{
v2f o;
o.pos = UnityObjectToClipPos(a.pos);
o.worldNormal = mul(a.normal,(float3x3)unity_WorldToObject);
return o;
}
fixed4 frag(v2f v):SV_TARGET
{
fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;
float3 worldNormal = normalize(v.worldNormal);
float3 worldLightDir = normalize(_WorldSpaceLightPos0.xyz);
fixed3 diffuse = _LightColor0.rgb * _Diffuse.rgb * max(0,dot(worldNormal,worldLightDir));
fixed3 finalColor = ambient + diffuse;
return fixed4(finalColor,1.0);
}
ENDCG
}
}
}
Half Lambert
![](https://img.haomeiwen.com/i12199894/9902ab3dee1500e3.png)
1、逐顶点
Shader "Unlit/Half-Lambert-Vertex"
{
Properties
{
_Diffuse("Diffuse",Color) = (1.0,1.0,1.0,1.0)
}
SubShader
{
pass
{
Tags {"LightModel"="ForwardBase"}
CGPROGRAM
#include "Lighting.cginc"
#pragma vertex vert
#pragma fragment frag
fixed4 _Diffuse;
struct a2v
{
float4 pos:POSITION;
float3 normal:NORMAL;
};
struct v2f
{
float4 clipPos:SV_POSITION;
fixed3 color:COLOR;
};
v2f vert(a2v a)
{
v2f o;
o.clipPos = UnityObjectToClipPos(a.pos);
fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;
float3 worldNormal = normalize(mul(a.normal,(float3x3)unity_WorldToObject));
float3 worldLightDir = normalize(_WorldSpaceLightPos0.xyz);
fixed3 diffuse = _LightColor0.rgb * _Diffuse.rgb * (0.5*dot(worldNormal,worldLightDir)+0.5);
o.color = ambient + diffuse;
return o;
}
fixed4 frag(v2f v):SV_TARGET
{
return fixed4(v.color,1.0);
}
ENDCG
}
}
}
2、逐像素
Shader "Unlit/Half-Lambert-Pixel"
{
Properties
{
_Diffuse("Diffuse",Color)=(1.0,1.0,1.0,1.0)
}
SubShader
{
Pass
{
Tags{"LightModel"="ForwardBase"}
CGPROGRAM
#include "Lighting.cginc"
#pragma vertex vert
#pragma fragment frag
fixed4 _Diffuse;
struct a2v
{
float4 pos:POSITION;
float3 normal:NORMAL;
};
struct v2f
{
float4 clipPos:SV_POSITION;
float3 worldNormal:TEXCOORD0;
};
v2f vert(a2v a)
{
v2f o;
o.clipPos = UnityObjectToClipPos(a.pos);
o.worldNormal = mul(a.normal,(float3x3)unity_WorldToObject);
return o;
}
fixed4 frag(v2f v):SV_TARGET
{
fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT;
float3 normalizedWorldNormal = normalize(v.worldNormal);
float3 worldLightDir = normalize(_WorldSpaceLightPos0.xyz);
fixed3 diffuse = _LightColor0.rgb * _Diffuse.rgb * (0.5*dot(normalizedWorldNormal,worldLightDir)+0.5);
return fixed4(ambient+diffuse,1.0);
}
ENDCG
}
}
}