漫反射模型:就是例如桌子底下没有光照但又不是完全黑的
这是因为有其他光源反射到桌子底下了
而想要做成实现中的光源 这个是有点难度的
所以就有简单的思路,做一个粗糙的光照模型
简单的思路:运用在平行光环境下
怎么判断一个点的受光强度?
通过一个点的法线和平行光的法线
夹角为0时说明光照强度最大
90度内越大光照强度越小
大于90度可以当作不受光
这是两个向量
点乘反映着两个向量的“相似度”,两个向量越“相似”,它们的点乘越大
下面附上代码
还有我学习的视频网址https://www.taikr.com/my/course/455
SubShader
{
Pass
{
Tags { "LightMode"="ForwardBase" }
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
// make fog work
#include "Lighting.cginc"
struct appdata
{
float4 vertex : POSITION;
float3 normal : NORMAL;
};
struct v2f
{
fixed3 color :Color;
float4 vertex : SV_POSITION;
};
v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
float3 lDir = normalize(_WorldSpaceLightPos0.xyz); //平行光
float3 nDir = normalize(mul(v.normal,(float3x3)unity_WorldToObject));//一个点的法线
fixed3 diffuse = _LightColor0.rgb*saturate(dot(nDir,lDir));//点乘反映着两个向量的“相似度”,两个向量越“相似”,它们的点乘越大
o.color = diffuse;
return o;
}
fixed4 frag (v2f i) : SV_Target
{
return fixed4(i.color,1.0);
}
ENDCG
}
}
效果
可以看出来有明显的三角形
片元着色器进行着色
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
// Upgrade NOTE: replaced '_World2Object' with 'unity_WorldToObject'
Shader "Unlit/VertDiffuseTest"
{
SubShader
{
Pass
{
Tags { "LightMode"="ForwardBase" }
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
// make fog work
#include "Lighting.cginc"
struct appdata
{
float4 vertex : POSITION;
float3 normal : NORMAL;
};
struct v2f
{
fixed3 normal : TEXCOORD0;
float4 vertex : SV_POSITION;
};
v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.normal = mul(v.normal, (float3x3)unity_WorldToObject);
return o;
}
fixed4 frag (v2f i) : SV_Target
{
float3 lDir = normalize(_WorldSpaceLightPos0.xyz); //平行光
float3 nDir = normalize(i.normal);//一个点的法线
fixed3 diffuse = _LightColor0.xyz * saturate(dot(lDir, nDir));//点乘反映着两个向量的“相似度”,两个向量越“相似”,它们的点乘越大
return fixed4(diffuse, 1.0);
}
ENDCG
}
}
}
效果
最后顺便说一下
顶点着色器是会对附上材质网格的每个顶点进行顶点上的改变
片段着色器是会对每个网格上三角形进行颜色上的改变
如果是考虑效率 一个模型的顶点较少可以在顶点做颜色的计算
一个模型的像素较少(离摄像机远 透视投影的情况下)可以在顶点做颜色的计算
考虑美观 就和上面的做法相反就行了