自我介绍
广东双非一本的大三小白,计科专业,想在制作毕设前夯实基础,毕设做出一款属于自己的游戏!
标准光照模型
把进入摄像机内的光线分为4部分:
- 自发光:emissive
- 高光反射:specular
- 漫反射:diffuse
- 环境光:ambient
逐顶点/片元渲染:
- 逐顶点渲染:也被称为高洛德着色,以来于线性插值得到像素光照,所以光照模型中有非先行计算时会出现问题(明显感到像素点,棱角现象)
- 逐片元渲染:也被称为Phong着色,以每个像素为基础得到他的法线,然后进行计算(颜色展示更加平滑)
漫反射
兰伯特定律(Lambert’s law):反射光线的强度与表面法线和光源方向之间夹角的余弦值成正比,写成算式如下
漫反射 = (光源颜色 * 漫反射颜色) * max(0, 模型法线单位向量 * 光源单位向量)
逐顶点渲染
Shader "Unlit/005"
{
Properties
{
_Diffuse("Diffuse", Color) = (1,1,1,1)
}
SubShader
{
Tags {
"RenderType"="Opaque" }
LOD 100
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
#include "Lighting.cginc"
fixed4 _Diffuse;
struct v2f
{
float4 vertex : SV_POSITION;
fixed3 color: Color;
};
v2f vert (appdata_base v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex); //把顶点信息从模型空间转换到裁剪空间
fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz; //获取环境光
fixed3 worldNormal = UnityObjectToWorldNormal( v.normal); //把法线信息从模型空间转换到世界空间
fixed3 worldLight = normalize(_WorldSpaceLightPos0.xyz); //获取世界空间下的光照方向(单位向量)
fixed3 diffuse = _LightColor0.rgb * _Diffuse.rgb * max(0, dot(worldNormal,worldLight)); //漫反射计算
o.color = diffuse + ambient;
return o;
}
fixed4 frag (v2f i) : SV_Target
{
return fixed4(i.color,1);
}
ENDCG
}
}
FallBack "Diffuse"
}
逐片元渲染
struct v2f
{
float4 vertex : SV_POSITION;
fixed3 worldNormal: TEXCOORD0;
};
v2f vert (appdata_base v)
{
v2f o